~ubuntu-branches/ubuntu/intrepid/perl-doc-html/intrepid

« back to all changes in this revision

Viewing changes to DB_File.html

  • Committer: Bazaar Package Importer
  • Author(s): Roberto C. Sanchez
  • Date: 2008-05-17 20:14:19 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20080517201419-qgbuogq2ckkdisyi
Tags: 5.10.0-2
Supersede botched upload of 5.10.0-1.

Show diffs side-by-side

added added

removed removed

Lines of Context:
54
54
      <h2>Links:</h2>
55
55
      <ul>
56
56
        <li><a href="http://search.cpan.org">CPAN</a></li>
 
57
        <li><a href="http://www.perl.org">Perl.org</a></li>
57
58
        <li><a href="http://www.perl.com">Perl.com</a></li>
58
 
        <li><a href="http://www.perl.org">Perl.org</a></li>
 
59
        <li><a href="http://perlbuzz.com">Perl Buzz</a></li>
 
60
        <li><a href="http://www.perlfoundation.org/perl5/index.cgi">Perl 5 Wiki</a></li>
 
61
        <li><a href="http://jobs.perl.org">Perl Jobs</a></li>
59
62
        <li><a href="http://www.pm.org">Perl Mongers</a></li>
60
63
        <li><a href="http://www.perlmonks.org">Perl Monks</a></li>
61
64
        <li><a href="http://planet.perl.org">Planet Perl</a></li>
65
68
      <ul>
66
69
        <li>Site maintained by<br><a href="http://perl.jonallen.info">Jon Allen</a>
67
70
            (<a href="http://perl.jonallen.info">JJ</a>)</li>
68
 
        <li class="spaced">Last updated on<br>23 April 2006</li>
 
71
        <li class="spaced">Last updated on<br>23 December 2007</li>
69
72
        <li class="spaced">See the <a href="http://perl.jonallen.info/projects/perldoc">project page</a> for
70
73
        more details</li>
71
74
      </ul>
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>
81
84
      </div>
82
85
      <div id="breadCrumbs"><a href="index.html">Home</a> &gt; <a href="index-modules-A.html">Core modules</a> &gt; <a href="index-modules-D.html">D</a> &gt; 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">&#39;DB_File&#39;</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">&#39;DB_File&#39;</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">&#39;DB_File&#39;</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">-&gt;length</span><span class="sc">;</span>
105
108
 <span class="i">$a</span> = <span class="i">$X</span><span class="i">-&gt;pop</span> <span class="sc">;</span>
106
 
 <span class="i">$X</span><span class="i">-&gt;push</span><span class="s">(</span>list<span class="s">)</span><span class="sc">;</span>
 
109
 <span class="i">$X</span><span class="i">-&gt;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">-&gt;shift</span><span class="sc">;</span>
108
 
 <span class="i">$X</span><span class="i">-&gt;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">-&gt;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">-&gt;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">-&gt;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">-&gt;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">-&gt;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>
166
169
 or the
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">&#39;DB_File&#39;</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>
206
209
 parameters in
207
210
dbopen().</p>
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>
215
218
,
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>
220
 
. </p>
 
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>
 
223
.</p>
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>-&gt;{<span class="q">&#39;cachesize&#39;</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
226
229
type.</p>
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>-&gt;{<span class="q">&#39;bsize&#39;</span>} <span class="sc">;</span>
231
234
     <span class="i">$a</span>-&gt;{<span class="q">&#39;cachesize&#39;</span>} <span class="sc">;</span>
232
235
     <span class="i">$a</span>-&gt;{<span class="q">&#39;ffactor&#39;</span>}<span class="sc">;</span>
233
236
     <span class="i">$a</span>-&gt;{<span class="q">&#39;hash&#39;</span>} <span class="sc">;</span>
234
237
     <span class="i">$a</span>-&gt;{<span class="q">&#39;lorder&#39;</span>} <span class="sc">;</span>
235
238
     <span class="i">$a</span>-&gt;{<span class="q">&#39;nelem&#39;</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>-&gt;{<span class="q">&#39;flags&#39;</span>} <span class="sc">;</span>
238
241
     <span class="i">$b</span>-&gt;{<span class="q">&#39;cachesize&#39;</span>} <span class="sc">;</span>
239
242
     <span class="i">$b</span>-&gt;{<span class="q">&#39;maxkeypage&#39;</span>} <span class="sc">;</span>
242
245
     <span class="i">$b</span>-&gt;{<span class="q">&#39;compare&#39;</span>} <span class="sc">;</span>
243
246
     <span class="i">$b</span>-&gt;{<span class="q">&#39;prefix&#39;</span>} <span class="sc">;</span>
244
247
     <span class="i">$b</span>-&gt;{<span class="q">&#39;lorder&#39;</span>} <span class="sc">;</span></pre>
245
 
<pre class="verbatim">     <span class="i">$c</span> = new DB_File::RECNOINFO <span class="sc">;</span>
 
248
<pre class="verbatim">     <span class="i">$c</span> = <span class="w">new</span> <span class="w">DB_File::RECNOINFO</span> <span class="sc">;</span>
246
249
     <span class="i">$c</span>-&gt;{<span class="q">&#39;bval&#39;</span>} <span class="sc">;</span>
247
250
     <span class="i">$c</span>-&gt;{<span class="q">&#39;cachesize&#39;</span>} <span class="sc">;</span>
248
251
     <span class="i">$c</span>-&gt;{<span class="q">&#39;psize&#39;</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>-&gt;{<span class="q">&#39;cachesize&#39;</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">&#39;DB_File&#39;</span><span class="cm">,</span> <span class="q">&quot;filename&quot;</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>
264
267
 store pointers
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>
289
292
        <a class="l_k" href="functions/return.html">return</a> <span class="i">$bytes</span> <span class="sc">;</span>
290
293
    <span class="s">}</span></pre>
291
294
<p>See <a href="#Changing-the-BTREE-sort-order">"Changing the BTREE sort order"</a> for an example of using the
292
 
<code class="inline">compare</code>
 
295
<code class="inline"><span class="w">compare</span></code>
293
296
 template.</p>
294
297
<p>If you are using the DB_RECNO interface and you intend making use of
295
 
<code class="inline">bval</code>
 
298
<code class="inline"><span class="w">bval</span></code>
296
299
, you should check out <a href="#The-'bval'-Option">"The 'bval' Option"</a>.</p>
297
300
<a name="Default-Parameters"></a><h2>Default Parameters</h2>
298
301
<p>It is possible to omit some or all of the final 4 parameters in the
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">&quot;DB_File&quot;</span><span class="cm">,</span> <span class="q">&quot;filename&quot;</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">&quot;DB_File&quot;</span><span class="cm">,</span> <span class="q">&quot;filename&quot;</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">&quot;DB_File&quot;</span><span class="cm">,</span> <span class="q">&quot;filename&quot;</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
305
308
call:</p>
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">&quot;DB_File&quot;</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">&quot;DB_File&quot;</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">&quot;DB_File&quot;</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">&quot;fruit&quot;</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">&quot;DB_File&quot;</span><span class="cm">,</span> <span class="q">&quot;fruit&quot;</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">&quot;DB_File&quot;</span><span class="cm">,</span> <span class="q">&quot;fruit&quot;</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">&quot;Cannot open file &#39;fruit&#39;: $!\n&quot;</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">&quot;apple&quot;</span>} = <span class="q">&quot;red&quot;</span> <span class="sc">;</span>
341
344
      <span class="s">{</span> <a class="l_k" href="functions/print.html">print</a> <span class="q">&quot;$k -&gt; $v\n&quot;</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 -&gt; orange
346
 
    tomato -&gt; red
347
 
    banana -&gt; 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">-&gt; orange</span>
 
349
    <span class="w">tomato</span> <span class="w">-&gt; red</span>
 
350
    <span class="w">banana</span> <span class="w">-&gt; 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>-&gt;{<span class="q">&#39;compare&#39;</span>} = \<span class="i">&amp;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">&quot;tree&quot;</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">&quot;DB_File&quot;</span><span class="cm">,</span> <span class="q">&quot;tree&quot;</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">&quot;DB_File&quot;</span><span class="cm">,</span> <span class="q">&quot;tree&quot;</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">&quot;Cannot open file &#39;tree&#39;: $!\n&quot;</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">&#39;Wall&#39;</span>} = <span class="q">&#39;Larry&#39;</span> <span class="sc">;</span>
384
387
      <span class="s">{</span> <a class="l_k" href="functions/print.html">print</a> <span class="q">&quot;$_\n&quot;</span> <span class="s">}</span></pre>
385
388
<pre class="verbatim">    <a class="l_k" href="functions/untie.html">untie</a> <span class="i">%h</span> <span class="sc">;</span></pre>
386
389
<p>Here is the output from the code above.</p>
387
 
<pre class="verbatim">    mouse
388
 
    Smith
389
 
    Wall</pre>
 
390
<pre class="verbatim">    <span class="w">mouse</span>
 
391
    <span class="w">Smith</span>
 
392
    <span class="w">Wall</span></pre>
390
393
<p>There are a few point to bear in mind if you want to change the
391
394
ordering in a BTREE database:</p>
392
395
<ol>
424
427
compared as equal).</p>
425
428
</li>
426
429
</ol>
427
 
<a name="Handling-Duplicate-Keys"></a><h2>Handling Duplicate Keys </h2>
 
430
<a name="Handling-Duplicate-Keys"></a><h2>Handling Duplicate Keys</h2>
428
431
<p>The BTREE file type optionally allows a single key to be associated
429
432
with an arbitrary number of values. This option is enabled by setting
430
433
the flags element of <code class="inline"><span class="i">$DB_BTREE</span></code>
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
434
437
code:</p>
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">&quot;tree&quot;</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>-&gt;{<span class="q">&#39;flags&#39;</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">&quot;DB_File&quot;</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>-&gt;{<span class="q">&#39;flags&#39;</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">&quot;DB_File&quot;</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">&quot;Cannot open $filename: $!\n&quot;</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">&#39;Wall&#39;</span>} = <span class="q">&#39;Larry&#39;</span> <span class="sc">;</span>
454
457
      <span class="s">{</span> <a class="l_k" href="functions/print.html">print</a> <span class="q">&quot;$_  -&gt; $h{$_}\n&quot;</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   -&gt; John
458
 
    Wall    -&gt; Larry
459
 
    Wall    -&gt; Larry
460
 
    Wall    -&gt; Larry
461
 
    mouse   -&gt; 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">-&gt; John</span>
 
461
    <span class="w">Wall</span>    <span class="w">-&gt; Larry</span>
 
462
    <span class="w">Wall</span>    <span class="w">-&gt; Larry</span>
 
463
    <span class="w">Wall</span>    <span class="w">-&gt; Larry</span>
 
464
    <span class="w">mouse</span>   <span class="w">-&gt; 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>
463
466
 
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>
477
480
 method
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>
480
483
 API method.</p>
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">&quot;tree&quot;</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>-&gt;{<span class="q">&#39;flags&#39;</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">&quot;DB_File&quot;</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>-&gt;{<span class="q">&#39;flags&#39;</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">&quot;DB_File&quot;</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">&quot;Cannot open $filename: $!\n&quot;</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">&#39;Wall&#39;</span>} = <span class="q">&#39;Larry&#39;</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">-&gt;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">-&gt;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">-&gt;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">-&gt;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">&quot;$key -&gt; $value\n&quot;</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   -&gt; John
508
 
    Wall    -&gt; Brick
509
 
    Wall    -&gt; Brick
510
 
    Wall    -&gt; Larry
511
 
    mouse   -&gt; mickey</pre>
 
510
<pre class="verbatim">    <span class="w">Smith</span>   <span class="w">-&gt; John</span>
 
511
    <span class="w">Wall</span>    <span class="w">-&gt; Brick</span>
 
512
    <span class="w">Wall</span>    <span class="w">-&gt; Brick</span>
 
513
    <span class="w">Wall</span>    <span class="w">-&gt; Larry</span>
 
514
    <span class="w">mouse</span>   <span class="w">-&gt; 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>
514
517
.</p>
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>
537
540
 like
538
541
this:</p>
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">&quot;tree&quot;</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>-&gt;{<span class="q">&#39;flags&#39;</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">&quot;DB_File&quot;</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>-&gt;{<span class="q">&#39;flags&#39;</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">&quot;DB_File&quot;</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">&quot;Cannot open $filename: $!\n&quot;</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">-&gt;get_dup</span><span class="s">(</span><span class="q">&quot;Wall&quot;</span><span class="s">)</span> <span class="sc">;</span>
549
552
    <a class="l_k" href="functions/print.html">print</a> <span class="q">&quot;Wall occurred $cnt times\n&quot;</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">&quot;tree&quot;</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>-&gt;{<span class="q">&#39;flags&#39;</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">&quot;DB_File&quot;</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>-&gt;{<span class="q">&#39;flags&#39;</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">&quot;DB_File&quot;</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">&quot;Cannot open $filename: $!\n&quot;</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">-&gt;find_dup</span><span class="s">(</span><span class="q">&quot;Wall&quot;</span><span class="cm">,</span> <span class="q">&quot;Larry&quot;</span><span class="s">)</span> == <span class="n">0</span> ? <span class="q">&quot;&quot;</span> <span class="co">:</span> <span class="q">&quot;not&quot;</span><span class="s">)</span> <span class="sc">;</span> 
581
584
    <a class="l_k" href="functions/print.html">print</a> <span class="q">&quot;Larry Wall is $found there\n&quot;</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">-&gt;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>
595
598
 database</p>
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">&quot;tree&quot;</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>-&gt;{<span class="q">&#39;flags&#39;</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">&quot;DB_File&quot;</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>-&gt;{<span class="q">&#39;flags&#39;</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">&quot;DB_File&quot;</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">&quot;Cannot open $filename: $!\n&quot;</span><span class="sc">;</span></pre>
605
608
<pre class="verbatim">    <span class="i">$x</span><span class="i">-&gt;del_dup</span><span class="s">(</span><span class="q">&quot;Wall&quot;</span><span class="cm">,</span> <span class="q">&quot;Larry&quot;</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">-&gt;find_dup</span><span class="s">(</span><span class="q">&quot;Wall&quot;</span><span class="cm">,</span> <span class="q">&quot;Larry&quot;</span><span class="s">)</span> == <span class="n">0</span> ? <span class="q">&quot;&quot;</span> <span class="co">:</span> <span class="q">&quot;not&quot;</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>
615
618
 method
616
619
is used along with the R_CURSOR flag.</p>
617
 
<pre class="verbatim">    <span class="i">$x</span><span class="i">-&gt;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">-&gt;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">-&gt;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">-&gt;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">&quot;$orig_key\t-&gt; $key\t-&gt; $value\n&quot;</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">&quot;tree&quot;</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">&quot;DB_File&quot;</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">&quot;DB_File&quot;</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">&quot;Cannot open $filename: $!\n&quot;</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">&#39;mouse&#39;</span>} = <span class="q">&#39;mickey&#39;</span> <span class="sc">;</span>
648
651
    <span class="i">$h</span>{<span class="q">&#39;Smith&#39;</span>} = <span class="q">&#39;John&#39;</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">&quot;IN ORDER\n&quot;</span> <span class="sc">;</span>
651
 
    for <span class="s">(</span><span class="i">$st</span> = <span class="i">$x</span><span class="i">-&gt;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">-&gt;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">-&gt;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">-&gt;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">&quot;$key   -&gt; $value\n&quot;</span> <span class="s">}</span></pre>
655
658
<pre class="verbatim">    <a class="l_k" href="functions/print.html">print</a> <span class="q">&quot;\nPARTIAL MATCH\n&quot;</span> <span class="sc">;</span></pre>
656
 
<pre class="verbatim">    match <span class="q">&quot;Wa&quot;</span> <span class="sc">;</span>
657
 
    match <span class="q">&quot;A&quot;</span> <span class="sc">;</span>
658
 
    match <span class="q">&quot;a&quot;</span> <span class="sc">;</span></pre>
 
659
<pre class="verbatim">    <span class="w">match</span> <span class="q">&quot;Wa&quot;</span> <span class="sc">;</span>
 
660
    <span class="w">match</span> <span class="q">&quot;A&quot;</span> <span class="sc">;</span>
 
661
    <span class="w">match</span> <span class="q">&quot;a&quot;</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
663
 
    Smith -&gt; John
664
 
    Wall  -&gt; Larry
665
 
    Walls -&gt; Brick
666
 
    mouse -&gt; mickey</pre>
667
 
<pre class="verbatim">    PARTIAL MATCH
668
 
    Wa -&gt; Wall  -&gt; Larry
669
 
    A  -&gt; Smith -&gt; John
670
 
    a  -&gt; mouse -&gt; 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">-&gt; John</span>
 
667
    <span class="w">Wall</span>  <span class="w">-&gt; Larry</span>
 
668
    <span class="w">Walls</span> <span class="w">-&gt; Brick</span>
 
669
    <span class="w">mouse</span> <span class="w">-&gt; 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">-&gt; Wall</span>  <span class="w">-&gt; Larry</span>
 
672
    <span class="w">A</span>  <span class="w">-&gt; Smith</span> <span class="w">-&gt; John</span>
 
673
    <span class="w">a</span>  <span class="w">-&gt; mouse</span> <span class="w">-&gt; 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">&quot;text&quot;</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">&quot;DB_File&quot;</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">&quot;DB_File&quot;</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">&quot;Cannot open file &#39;text&#39;: $!\n&quot;</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">&quot;orange&quot;</span> <span class="sc">;</span>
749
752
<p>Here are the methods:</p>
750
753
<ul>
751
754
<li><a name="*%24X-%3epush(list)-%3b*"></a><b><b>$X-&gt;push(list) ;</b></b>
752
 
<p>Pushes the elements of <code class="inline">list</code>
 
755
<p>Pushes the elements of <code class="inline"><span class="w">list</span></code>
753
756
 to the end of the array.</p>
754
757
</li>
755
758
<li><a name="*%24value-%3d-%24X-%3epop-%3b*"></a><b><b>$value = $X-&gt;pop ;</b></b>
759
762
<p>Removes and returns the first element of the array.</p>
760
763
</li>
761
764
<li><a name="*%24X-%3eunshift(list)-%3b*"></a><b><b>$X-&gt;unshift(list) ;</b></b>
762
 
<p>Pushes the elements of <code class="inline">list</code>
 
765
<p>Pushes the elements of <code class="inline"><span class="w">list</span></code>
763
766
 to the start of the array.</p>
764
767
</li>
765
768
<li><a name="*%24X-%3elength*"></a><b><b>$X-&gt;length</b></b>
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">&quot;text&quot;</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">&quot;DB_File&quot;</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">&quot;DB_File&quot;</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">&quot;Cannot open file $file: $!\n&quot;</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">&quot;zero&quot;</span> <span class="sc">;</span>
792
795
    <span class="c">#</span>
793
796
    <span class="c"># The length method is needed here because evaluating a tied</span>
794
797
    <span class="c"># array in a scalar context does not return the number of</span>
795
 
    <span class="c"># elements in the array.  </span></pre>
 
798
    <span class="c"># elements in the array.</span></pre>
796
799
<pre class="verbatim">    <a class="l_k" href="functions/print.html">print</a> <span class="q">&quot;\nORIGINAL\n&quot;</span> <span class="sc">;</span>
797
800
    foreach <span class="i">$i</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$H</span><span class="i">-&gt;length</span> - <span class="n">1</span><span class="s">)</span> <span class="s">{</span>
798
801
        <a class="l_k" href="functions/print.html">print</a> <span class="q">&quot;$i: $h[$i]\n&quot;</span> <span class="sc">;</span>
807
810
    <a class="l_k" href="functions/print.html">print</a> <span class="q">&quot;The first record was [$a]\n&quot;</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">-&gt;put</span><span class="s">(</span><span class="i">$i</span><span class="cm">,</span> <span class="q">&quot;Newbie&quot;</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">-&gt;put</span><span class="s">(</span><span class="i">$i</span><span class="cm">,</span> <span class="q">&quot;Newbie&quot;</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">-&gt;put</span><span class="s">(</span><span class="i">$i</span><span class="cm">,</span> <span class="q">&quot;New One&quot;</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">-&gt;put</span><span class="s">(</span><span class="i">$i</span><span class="cm">,</span> <span class="q">&quot;New One&quot;</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">-&gt;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">&quot;\nREVERSE again\n&quot;</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">-&gt;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">-&gt;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">-&gt;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">-&gt;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">&quot;$k: $v\n&quot;</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>
832
835
    1: one
833
836
    2: two
834
837
    3: three
835
 
    4: four</pre><pre class="verbatim">    The <a class="l_k" href="functions/last.html">last</a> <span class="j">record</span> was <span class="s">[</span>four<span class="s">]</span>
836
 
    The first record was <span class="s">[</span>zero<span class="s">]</span></pre>
 
838
    4: four</pre><pre class="verbatim">    <span class="w">The</span> <a class="l_k" href="functions/last.html">last</a> <span class="j">record</span> <span class="w">was</span> <span class="s">[</span><span class="w">four</span><span class="s">]</span>
 
839
    <span class="w">The</span> <span class="w">first</span> <span class="w">record</span> <span class="w">was</span> <span class="s">[</span><span class="w">zero</span><span class="s">]</span></pre>
837
840
<pre class="verbatim">    REVERSE
838
841
    5: last
839
842
    4: three
853
856
 like this:</p>
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">-&gt;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">-&gt;length</span> - <span class="n">1</span><span class="s">)</span></pre>
857
860
<p>or this:</p>
858
 
<pre class="verbatim">    for <span class="s">(</span><span class="i">$a</span> = <span class="i">$H</span><span class="i">-&gt;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">-&gt;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">-&gt;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">-&gt;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>
861
864
</li>
862
865
<li>
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>
870
873
</li>
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">&quot;DB_File&quot;</span><span class="cm">,</span> <span class="q">&quot;filename&quot;</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">-&gt;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">-&gt;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
884
 
destroyed. </p>
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>
 
887
destroyed.</p>
 
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">&quot;DB_File&quot;</span><span class="cm">,</span> <span class="q">&quot;filename&quot;</span> 
887
890
        or <a class="l_k" href="functions/die.html">die</a> <span class="q">&quot;Cannot tie filename: $!&quot;</span> <span class="sc">;</span>
888
891
    ...
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">&#39;DB_File&#39;</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">&#39;DB_File&#39;</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">&quot;Cannot tie $filename: $!&quot;</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">-&gt;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">-&gt;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&#39;t, it got the last key/value pair!</span>
926
 
    <span class="i">$X</span><span class="i">-&gt;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">-&gt;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">&#39;DB_File&#39;</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">&#39;DB_File&#39;</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">&quot;Cannot tie $filename: $!&quot;</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">-&gt;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">-&gt;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">-&gt;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">-&gt;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>
937
940
</li>
938
941
</ul>
939
942
<p>All the constants defined in <a href="http://search.cpan.org/perldoc/dbopen">dbopen</a> for use in the flags parameters
968
971
<li><a name="*%24status-%3d-%24X-%3efd-%3b*"></a><b><b>$status = $X-&gt;fd ;</b></b>
969
972
<p>Returns the file descriptor for the underlying database.</p>
970
973
<p>See <a href="#Locking%3a-The-Trouble-with-fd">"Locking: The Trouble with fd"</a> for an explanation for why you should
971
 
not use <code class="inline">fd</code>
 
974
not use <code class="inline"><span class="w">fd</span></code>
972
975
 to lock your database.</p>
973
976
</li>
974
977
<li><a name="*%24status-%3d-%24X-%3eseq(%24key%2c-%24value%2c-%24flags)-%3b*"></a><b><b>$status = $X-&gt;seq($key, $value, $flags) ;</b></b>
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">&quot;filt&quot;</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">&#39;DB_File&#39;</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">&#39;DB_File&#39;</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">&quot;Cannot open $filename: $!\n&quot;</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">-&gt;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">&quot;filt&quot;</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">&#39;DB_File&#39;</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">&#39;DB_File&#39;</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">&quot;Cannot open $filename: $!\n&quot;</span> <span class="sc">;</span></pre>
1081
1084
<pre class="verbatim">    <span class="i">$db</span><span class="i">-&gt;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">&quot;i&quot;</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">-&gt;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">&quot;i&quot;</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
1089
1092
filters.</p>
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
1096
1099
peril!</p>
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">&#39;DB_File&#39;</span><span class="cm">,</span> <span class="q">&#39;foo.db&#39;</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">&#39;DB_File&#39;</span><span class="cm">,</span> <span class="q">&#39;foo.db&#39;</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">&quot;dbcreat foo.db $!&quot;</span><span class="sc">;</span>
1100
1103
    <span class="i">$fd</span> = <span class="i">$db</span><span class="i">-&gt;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">&quot;+&lt;&amp;=$fd&quot;</span><span class="s">)</span> || <a class="l_k" href="functions/die.html">die</a> <span class="q">&quot;dup $!&quot;</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">&quot;flock: $!&quot;</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">&quot;+&lt;&amp;=$fd&quot;</span><span class="s">)</span> || <a class="l_k" href="functions/die.html">die</a> <span class="q">&quot;dup $!&quot;</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">&quot;flock: $!&quot;</span><span class="sc">;</span>
1103
1106
    ...
1104
1107
    <span class="i">$db</span>{<span class="q">&quot;Tom&quot;</span>} = <span class="q">&quot;Jerry&quot;</span> <span class="sc">;</span>
1105
1108
    ...
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>
1111
1114
<ol>
1112
1115
<li>
1165
1168
system. However, updates are still serial. Use for databases where reads
1166
1169
may be lengthy and consistency problems may occur.</p>
1167
1170
</li>
1168
 
<li><a name="*Tie%3a%3aDB_LockFile*"></a><b><b>Tie::DB_LockFile</b> </b>
 
1171
<li><a name="*Tie%3a%3aDB_LockFile*"></a><b><b>Tie::DB_LockFile</b></b>
1169
1172
<p>A <b>DB_File</b> wrapper that has the ability to lock and unlock the database
1170
1173
while it is being used. Avoids the tie-before-flock problem by simply
1171
1174
re-tie-ing the database when you get or drop a lock.  Because of the
1174
1177
updates and/or reads if the application follows the hints in the POD
1175
1178
documentation.</p>
1176
1179
</li>
1177
 
<li><a name="*DB_File%3a%3aLock*"></a><b><b>DB_File::Lock</b> </b>
 
1180
<li><a name="*DB_File%3a%3aLock*"></a><b><b>DB_File::Lock</b></b>
1178
1181
<p>An extremely lightweight <b>DB_File</b> wrapper that simply flocks a lockfile
1179
1182
before tie-ing the database and drops the lock after the untie. Allows
1180
1183
one to use the same lockfile for multiple databases to avoid deadlock
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">&quot;$dotdir/.netscape/history.db&quot;</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">&#39;DB_File&#39;</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">&quot;Cannot open $HISTORY: $!\n&quot;</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">&#39;DB_File&#39;</span><span class="cm">,</span> <span class="q">&#39;tst.fil&#39;</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">&#39;DB_File&#39;</span><span class="cm">,</span> <span class="q">&#39;tst.fil&#39;</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">&quot;Cannot tie first time: $!&quot;</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">&#39;DB_File&#39;</span><span class="cm">,</span> <span class="q">&#39;tst.fil&#39;</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">&#39;DB_File&#39;</span><span class="cm">,</span> <span class="q">&#39;tst.fil&#39;</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">&quot;Cannot tie second time: $!&quot;</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>
1271
1274
    <span class="i">$x</span>{<span class="n">123</span>} = <span class="n">456</span> <span class="sc">;</span></pre>
1272
1275
<pre class="verbatim">    <a class="l_k" href="functions/undef.html">undef</a> <span class="i">$X</span> <span class="sc">;</span>
1273
1276
    <a class="l_k" href="functions/untie.html">untie</a> <span class="i">%x</span> <span class="sc">;</span></pre>
1274
 
<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">&#39;DB_File&#39;</span><span class="cm">,</span> <span class="q">&#39;tst.fil&#39;</span> <span class="cm">,</span> O_RDWR|O_CREAT
 
1277
<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">&#39;DB_File&#39;</span><span class="cm">,</span> <span class="q">&#39;tst.fil&#39;</span> <span class="cm">,</span> <span class="w">O_RDWR</span>|<span class="w">O_CREAT</span>
1275
1278
    ...</pre>
1276
1279
<a name="COMMON-QUESTIONS"></a><h1>COMMON QUESTIONS</h1>
1277
1280
<a name="Why-is-there-Perl-source-in-my-database%3f"></a><h2>Why is there Perl source in my database?</h2>
1299
1302
<p>Here are a couple of possibilities:</p>
1300
1303
<ol>
1301
1304
<li>
1302
 
<p>Attempting to reopen a database without closing it. </p>
 
1305
<p>Attempting to reopen a database without closing it.</p>
1303
1306
</li>
1304
1307
<li>
1305
1308
<p>Using the O_WRONLY flag.</p>
1306
1309
</li>
1307
1310
</ol>
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">&#39;subs&#39;</span></code>
 
1313
<code class="inline"><span class="w">strict</span> <span class="q">&#39;subs&#39;</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">&quot;filename&quot;</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">&quot;filename&quot;</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>
 
1323
 in either single or
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">&quot;DB_File&quot;</span><span class="cm">,</span> <span class="q">&quot;filename&quot;</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>
1348
1352
<p>This version of <b>DB_File</b> will work with either version 1.x, 2.x or
1349
1353
3.x of Berkeley DB, but is limited to the functionality provided by
1350
1354
version 1.</p>
1351
 
<p>The official web site for Berkeley DB is <i><a href="http://www.sleepycat.com">http://www.sleepycat.com</a></i>.
 
1355
<p>The official web site for Berkeley DB is <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>.
1352
1356
All versions of Berkeley DB are available there.</p>
1353
1357
<p>Alternatively, Berkeley DB version 1 is available at your nearest CPAN
1354
1358
archive in <i>src/misc/db.1.85.tar.gz</i>.</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>
1377
1381
<a href="perldbmfilter.html">perldbmfilter</a></p>
1378
1382
<a name="AUTHOR"></a><h1>AUTHOR</h1>
1379
1383
<p>The DB_File interface was written by Paul Marquess
1380
 
&lt;pmqs@cpan.org&gt;.
1381
 
Questions about the DB system itself may be addressed to
1382
 
&lt;db@sleepycat.com&gt;.</p>
 
1384
&lt;pmqs@cpan.org&gt;.</p>
1383
1385
</div>
1384
1386
      <div id="contentFooter"><a href="http://www.perl.org"><img src="perlpowered.png" border=0></a></div>
1385
1387
    </div>
1397
1399
          <!--<select name="r"><option value="1" selected>Go to top result<option value="0">Show results list</select>-->
1398
1400
        </form>
1399
1401
      </p>
 
1402
      <script language="JavaScript" type="text/javascript" src="/perl-version.js"></script>
1400
1403
      <h2>Labels:</h2>
1401
1404
      <p>
1402
1405
        <a href="#" onClick="addLabel('DB_File','DB_File.html')">Add this page</a>