File: keyCreator.html

package info (click to toggle)
db4.3 4.3.29-8
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 34,368 kB
  • ctags: 26,050
  • sloc: ansic: 111,720; tcl: 39,474; java: 29,503; perl: 11,771; sh: 11,295; cpp: 8,584; makefile: 1,769; awk: 1,312; cs: 457; xml: 114; php: 22; asm: 14
file content (149 lines) | stat: -rw-r--r-- 5,866 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
    <title>Implementing Key 
        
        Extractors
        </title>
    <link rel="stylesheet" href="gettingStarted.css" type="text/css" />
    <meta name="generator" content="DocBook XSL Stylesheets V1.62.4" />
    <link rel="home" href="index.html" title="Getting Started with Berkeley DB" />
    <link rel="up" href="indexes.html" title="Chapter5.Secondary Databases" />
    <link rel="previous" href="indexes.html" title="Chapter5.Secondary Databases" />
    <link rel="next" href="readSecondary.html" title="Reading Secondary Databases" />
  </head>
  <body>
    <div class="navheader">
      <table width="100%" summary="Navigation header">
        <tr>
          <th colspan="3" align="center">Implementing Key 
        
        Extractors
        </th>
        </tr>
        <tr>
          <td width="20%" align="left"><a accesskey="p" href="indexes.html">Prev</a></td>
          <th width="60%" align="center">Chapter5.Secondary Databases</th>
          <td width="20%" align="right"><a accesskey="n" href="readSecondary.html">Next</a></td>
        </tr>
      </table>
      <hr />
    </div>
    <div class="sect1" lang="en" xml:lang="en">
      <div class="titlepage">
        <div>
          <div>
            <h2 class="title" style="clear: both"><a id="keyCreator"></a>Implementing Key 
        
        <span>Extractors</span>
        </h2>
          </div>
        </div>
        <div></div>
      </div>
      <p>
        You must provide every secondary database with a 
            
            <span>callback</span>
        that creates keys from primary records. You identify this 
            
            <span>callback</span>
        
        
        <span>
            when you associate your secondary database to your primary.
        </span>
     </p>
      <p>
        You can create keys using whatever data you want. Typically you will
        base your key on some information found in a record's data, but you
        can also use information found in the primary record's key. How you build
        your keys is entirely dependent upon the nature of the index that you
        want to maintain.
    </p>
      <p>
        You implement a key extractor by writing a function that extracts
        the necessary information from a primary record's key or data.
        This function must conform to a specific prototype, and it must be
        provided as a callback to the <tt class="methodname">associate()</tt>
        method.
    </p>
      <p>
        For example, suppose your primary database records contain data that
        uses the following structure:
    </p>
      <a id="c_index3"></a>
      <pre class="programlisting">typedef struct vendor {
    char name[MAXFIELD];             /* Vendor name */
    char street[MAXFIELD];           /* Street name and number */
    char city[MAXFIELD];             /* City */
    char state[3];                   /* Two-digit US state code */
    char zipcode[6];                 /* US zipcode */
    char phone_number[13];           /* Vendor phone number */
    char sales_rep[MAXFIELD];        /* Name of sales representative */
    char sales_rep_phone[MAXFIELD];  /* Sales rep's phone number */
} VENDOR; </pre>
      <p>
        Further suppose that you want to be able to query your primary database
        based on the name of a sales representative. Then you would write a
        function that looks like this:
    </p>
      <a id="c_index4"></a>
      <pre class="programlisting">#include &lt;db.h&gt;

...

int
get_sales_rep(DB *sdbp,          /* secondary db handle */
              const DBT *pkey,   /* primary db record's key */
              const DBT *pdata,  /* primary db record's data */
              DBT *skey)         /* secondary db record's key */
{
    VENDOR *vendor;

    /* First, extract the structure contained in the primary's data */
    vendor = pdata-&gt;data;

    /* Now set the secondary key's data to be the representative's name */
    memset(skey, 0, sizeof(DBT));
    skey-&gt;data = vendor-&gt;sales_rep;
    skey-&gt;size = strlen(vendor-&gt;sales_rep) + 1;

    /* Return 0 to indicate that the record can be created/updated. */
    return (0);
} </pre>
      <p>
        In order to use this function, you provide it on the
        <tt class="methodname">associate()</tt> method after the primary and
        secondary databases have been created and opened:
    </p>
      <a id="c_index5"></a>
      <pre class="programlisting">dbp-&gt;associate(dbp,            /* Primary database */
               NULL,           /* TXN id */
               sdbp,           /* Secondary database */
               get_sales_rep,  /* Callback used for key creation. */
               0);             /* Flags */</pre>
    </div>
    <div class="navfooter">
      <hr />
      <table width="100%" summary="Navigation footer">
        <tr>
          <td width="40%" align="left"><a accesskey="p" href="indexes.html">Prev</a></td>
          <td width="20%" align="center">
            <a accesskey="u" href="indexes.html">Up</a>
          </td>
          <td width="40%" align="right"><a accesskey="n" href="readSecondary.html">Next</a></td>
        </tr>
        <tr>
          <td width="40%" align="left" valign="top">Chapter5.Secondary Databases</td>
          <td width="20%" align="center">
            <a accesskey="h" href="index.html">Home</a>
          </td>
          <td width="40%" align="right" valign="top">Reading Secondary Databases</td>
        </tr>
      </table>
    </div>
  </body>
</html>