]> git.sur5r.net Git - openldap/blob - doc/guide/admin/dbtools.sdf
Revamp chapter 1
[openldap] / doc / guide / admin / dbtools.sdf
1 # $OpenLDAP$
2 # Copyright 1999-2000, The OpenLDAP Foundation, All Rights Reserved.
3 # COPYING RESTRICTIONS APPLY, see COPYRIGHT.
4
5 H1: Database Creation and Maintenance Tools
6
7 This section tells you how to create a slapd database from
8 scratch, and how to do trouble shooting if you run into
9 problems. There are two ways to create a database. First,
10 you can create the database on-line using LDAP. With this
11 method, you simply start up slapd and add entries using the
12 LDAP client of your choice. This method is fine for relatively
13 small databases (a few hundred or thousand entries,
14 depending on your requirements).
15
16 The second method of database creation is to do it off-line,
17 using the index generation tools. This method is best if you
18 have many thousands of entries to create, which would take
19 an unacceptably long time using the LDAP method, or if you
20 want to ensure the database is not accessed while it is
21 being created.
22
23
24 H2: Creating a database over LDAP
25
26 With this method, you use the LDAP client of your choice
27 (e.g., the ldapadd(1) tool) to add entries, just like you would
28 once the database is created. You should be sure to set the
29 following configuration options before starting slapd:
30
31 E:      suffix <dn>
32
33 As described in the preceding section, this option says what
34 entries are to be held by this database. You should set this
35 to the DN of the root of the subtree you are trying to create.
36 For example
37
38 E:      suffix "dc=OpenLDAP, dc=org"
39
40 You should be sure to specify a directory where the index
41 files should be created:
42
43 E:      directory <directory>
44
45 For example:
46
47 E:      directory /usr/local/openldap/slapd
48
49 You need to make it so you can connect to slapd as
50 somebody with permission to add entries. This is done
51 through the following two options in the database definition:
52
53 E:      rootdn <dn>
54 E:      rootpw <passwd>
55
56 These options specify a DN and password that can be used
57 to authenticate as the "superuser" entry of the database (i.e.,
58 the entry allowed to do anything). The DN and password
59 specified here will always work, regardless of whether the
60 entry named actually exists or has the password given. This
61 solves the chicken-and-egg problem of how to authenticate
62 and add entries before any entries yet exist.
63
64 Finally, you should make sure that the database definition
65 contains the index definitions you want:
66
67 E:      index {<attrlist> | default} [pres,eq,approx,sub,none]
68
69 For example, to index the cn, sn, uid and objectclass
70 attributes the following index configuration lines could be
71 used.
72
73 E:      index cn,sn,uid
74 E:      index objectclass pres,eq
75 E:      index default none
76
77 See Section 4 on the configuration file for more details on
78 this option. Once you have configured things to your liking,
79 start up slapd, connect with your LDAP client, and start
80 adding entries. For example, to add a the organizational entry
81 followed by a Postmaster entry using the {{I:ldapadd}} tool, you
82 could create a file called {{EX:/tmp/newentry}} with the contents:
83
84
85 E: dc=OpenLDAP, dc=org
86 E: objectClass=dcObject
87 E: objectClass=organization
88 E: dc=OpenLDAP
89 E: o=OpenLDAP
90 E: o=OpenLDAP Project
91 E: o=OpenLDAP Foundation
92 E: description=The OpenLDAP Foundation
93 E: description=The OpenLDAP Project
94 E:
95 E: cn=Postmaster, dc=OpenLDAP, dc=org
96 E: objectClass=organizationalRole
97 E: cn=Postmaster
98 E: description=OpenLDAP Postmaster <Postmaster@OpenLDAP.org>
99
100 and then use a command like this to actually create the
101 entry:
102
103 E: ldapadd -f /tmp/newentry -D "cn=Manager, dc=OpenLDAP, dc=org" -w secret
104
105 The above command assumes that you have set {{EX: rootdn}} to
106 "cn=Manager, dc=OpenLDAP, dc=org" and {{EX: rootpw}}
107 to "secret".
108
109
110 H2: Creating a database off-line
111
112 The second method of database creation is to do it off-line,
113 using the index generation tools described below. This
114 method is best if you have many thousands of entries to
115 create, which would take an unacceptably long time using
116 the LDAP method described above. These tools read the
117 slapd configuration file and an input file containing a text
118 representation of the entries to add. They produce the LDBM
119 index files directly. There are several important configuration
120 options you will want to be sure and set in the config file
121 database definition first:
122
123 E:      suffix <dn>
124
125 As described in the preceding section, this option says what
126 entries are to be held by this database. You should set this
127 to the DN of the root of the subtree you are trying to create.
128 For example
129
130 E:      suffix "dc=OpenLDAP, dc=org"
131
132 You should be sure to specify a directory where the index
133 files should be created:
134
135 E:      directory <directory>
136
137 For example:
138
139 E:      directory /usr/local/var/openldap
140
141 Next, you probably want to increase the size of the in-core
142 cache used by each open index file. For best performance
143 during index creation, the entire index should fit in memory. If
144 your data is too big for this, or your memory too small, you
145 can still make it pretty big and let the paging system do the
146 work. This size is set with the following option:
147
148 E:      dbcachesize <integer>
149
150 For example:
151
152 E:      dbcachesize 50000000
153
154 This would create a cache 50 MB big, which is pretty big (at
155 U-M, our database has about 125K entries, and our biggest
156 index file is about 45 MB). Experiment with this number a bit,
157 and the degree of parallelism (explained below), to see what
158 works best for your system. Remember to turn this number
159 back down once your index files are created and before you
160 run slapd.
161
162 Finally, you need to specify which indexes you want to build.
163 This is done by one or more index options.
164
165 E:      index {<attrlist> | default} [pres,eq,approx,sub,none]
166
167 For example:
168
169 E:      index cn,sn,uid pres,eq,approx
170 E:      index default none
171
172 This would create presence, equality and approximate
173 indexes for the cn, sn, and uid attributes, and no indexes for
174 any other attributes. See the configuration file section for
175 more information on this option.
176
177 H3: The {{EX: ldif2ldbm}} program
178
179 Once you've configured things to your liking, you create the
180 indexes by running the ldif2ldbm program:
181
182 E:      ldif2ldbm -i <inputfile> -f <slapdconfigfile>
183 E:              [-d <debuglevel>] [-j <integer>]
184 E:              [-n <databasenumber>] [-e <etcdir>]
185
186 The arguments have the following meanings:
187
188 E:      -i <inputfile>
189
190 Specifies the LDIF input file containing the entries to add in
191 text form (described below in Section 8.3).
192
193 E:      -f <slapdconfigfile>
194
195 Specifies the slapd configuration file that tells where to
196 create the indexes, what indexes to create, etc.
197
198 E:      -d <debuglevel>
199
200 Turn on debugging, as specified by {{EX: <debuglevel>}}. The
201 debug levels are the same as for slapd (see Section 6.1).
202
203 E:      -j <integer>
204
205 An optional argument that specifies that at most {{EX: <integer>}}
206 processes should be started in parallel when building the
207 indexes. The default is 1. If set to a value greater than one,
208 {{I: ldif2ldbm}} will create at most that many subprocesses at a
209 time when building the indexes. A separate subprocess is
210 created to build each attribute index. Running these
211 processes in parallel can speed things up greatly, but
212 beware of creating too many processes, all competing for
213 memory and disk resources.
214
215 E:      -n <databasenumber>
216
217 An optional argument that specifies the configuration file
218 database for which to build indices. The first database listed
219 is "1", the second "2", etc. By default, the first ldbm database
220 in the configuration file is used.
221
222 E:      -e <etcdir>
223
224 An optional argument that specifies the directory where
225 {{EX: ldif2ldbm}} can find the other database conversion tools it
226 needs to execute ({{EX: ldif2index}} and friends). The default is the
227 installation {{EX: ETCDIR}}.
228
229 The next sections describe the programs invoked by
230 {{I: ldif2ldbm}} when it is building indexes. Normally, these
231 programs are invoked for you, but occasionally you may
232 want to invoke them yourself.
233
234
235
236 H3: The {{EX: ldif2index}} program
237
238 Sometimes it may be necessary to create a new attribute
239 index file without disturbing the rest of the database. This is
240 possible using the {{EX: ldif2index}} program. {{EX: ldif2index}} is invoked
241 like this
242
243 E:      ldif2index -i <inputfile> -f <slapdconfigfile>
244 E:              [-d <debuglevel>] [-n <databasenumber>] <attr>
245
246 Where the -i, -f, -d, and -n options are the same as for the
247 {{I: ldif2ldbm}} program. {{EX: <attr>}} is the attribute to build an index for.
248 Which indexes are built (e.g., equality, substring, etc.) is
249 controlled by the corresponding index line in the slapd
250 configuration file.
251
252 You can use the ldbmcat program to create a suitable LDIF
253 input file from an existing LDBM database.
254
255
256
257 H3: The {{EX: ldif2id2entry}} program
258
259 The {{EX: ldif2id2entry}} program is normally invoked from {{EX: ldif2ldbm}}.
260 It is used to convert an LDIF text file into an {{EX: id2entry}} index.
261 It is unlikely that you would need to invoke it yourself, but if
262 you do it works like this
263
264 E:      ldif2id2entry -i <inputfile> -f <slapdconfigfile>
265 E:              [-d <debuglevel>] [-n <databasenumber>]
266
267 The arguments are the same as for the {{EX: ldif2ldbm}} program.
268
269
270
271 H3: The {{EX: ldif2id2children}} program
272
273 The {{EX: ldif2id2children}} program is normally invoked from
274 {{EX: ldif2ldbm}}. It is used to convert an LDIF text file into
275 {{EX: id2children}} and {{EX: dn2id}} indexes. Occasionally, it may be
276 necessary to run this program yourself, for example if one of
277 these indexes has become corrupted. {{EX: ldif2id2children}} is
278 invoked like this
279
280 E:      ldif2id2children -i <inputfile> -f <slapdconfigfile>
281 E:              [-d <debuglevel>] [-n <databasenumber>]
282
283 The arguments are the same as for the {{EX: ldif2ldbm}} program.
284 You can use the ldbmcat program to create a suitable LDIF
285 input file from an existing LDBM database.
286
287
288
289 H3: The {{EX: ldbmcat}} program
290
291 The {{EX: ldbmcat}} program is used to convert an {{EX: id2entry}} index
292 back into its LDIF text format. This can be useful when you
293 want to make a human-readable backup of your database,
294 or as an intermediate step in creating a new index using the
295 {{EX: ldif2index}} program. The program is invoked like this:
296
297 E:      ldbmcat [-n] <filename>
298
299 where {{EX: <filename>}} is the name of the {{EX: id2entry}} index file. The
300 corresponding LDIF output is written to standard output.
301
302 The -n option can be used to prevent the printing of entry
303 IDs in the LDIF format. If you are creating an LDIF format for
304 use as input to {{EX: ldif2index}} or anything by {{EX: ldif2ldbm}}, you
305 should not use the -n option (because the entry IDs must
306 match those already in the id2entry file). If you are just
307 making a backup of your data, you can use the -n option to
308 save space.
309
310
311
312 H3: The {{EX: ldif}} program
313
314 The ldif program is used to convert arbitrary data values to
315 LDIF format. This can be useful when writing a program or
316 script to create the LDIF file you will feed into the ldif2ldbm
317 program, or when writing a SHELL backend. ldif takes an
318 attribute name as an argument, and reads the attribute
319 value(s) from standard input. It produces the LDIF formatted
320 attribute line(s) on standard output. The usage is:
321
322 E:      ldif [-b] <attrname>
323
324 where {{EX: <attrname>}} is the name of the attribute. Without the
325 -b option, ldif considers each line of standard input to be a
326 separate value of the attribute.
327
328 The -b option can be used to force ldif to interpret its input
329 as a single raw binary value. This option is useful when
330 converting binary data such as a {{EX: jpegPhoto}} or {{EX: audio}}
331 attribute.
332
333
334 H2: The LDIF text entry format
335
336 The LDAP Data Interchange Format (LDIF) is used to
337 represent LDAP entries in a simple text format. The basic
338 form of an entry is:
339
340 E:      [<id>]
341 E:      dn: <distinguished name>
342 E:      <attrtype>: <attrvalue>
343 E:      <attrtype>: <attrvalue>
344 E:
345 E:      ...
346
347 where {{EX: <id>}} is the optional entry ID (a positive decimal
348 number). Normally, you would not supply the {{EX: <id>}}, allowing
349 the database creation tools to do that for you. The ldbmcat
350 program, however, produces an LDIF format that includes
351 {{EX: <id>}} so that new indexes created will be consistent.
352
353 A line may be continued by starting the next line with a
354 single space or tab character. e.g.,
355
356 E:      dn: cn=Barbara J Jensen, dc=OpenLDAP, dc=org
357
358 Multiple attribute values are specified on separate lines. e.g.,
359
360 E:      cn: Barbara J Jensen
361 E:      cn: Babs Jensen
362
363 If an {{EX: <attrvalue>}} contains a non-printing character, or
364 begins with a space or a colon `:', the {{EX: <attrtype>}} is followed
365 by a double colon and the value is encoded in base 64
366 notation. e.g., the value " begins with a space" would be
367 encoded like this:
368
369 E:      cn:: IGJlZ2lucyB3aXRoIGEgc3BhY2U=
370
371 Multiple entries within the same LDIF file are separated by
372 blank lines. Here's an example of an LDIF file containing
373 three entries.
374
375 E:      dn: cn=Barbara J Jensen, dc=OpenLDAP, dc=org
376 E:      cn: Barbara J Jensen
377 E:      cn: Babs Jensen
378 E:      objectclass: person
379 E:      sn: Jensen
380 E:
381 E:
382 E:      dn: cn=Bjorn J Jensen, dc=OpenLDAP, dc=org
383 E:      cn: Bjorn J Jensen
384 E:      cn: Bjorn Jensen
385 E:      objectclass: person
386 E:      sn: Jensen
387 E:
388 E:      dn: cn=Jennifer J Jensen, dc=OpenLDAP, dc=org
389 E:      cn: Jennifer J Jensen
390 E:      cn: Jennifer Jensen
391 E:      objectclass: person
392 E:      sn: Jensen
393 E:      jpegPhoto:: /9j/4AAQSkZJRgABAAAAAQABAAD/2wBDABALD
394 E:      A4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQ
395 E:      ERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVG
396 E:      
397 E:      ...
398
399 Notice that the {{EX: jpegPhoto}} in Jennifer Jensen's entry is
400 encoded using base 64. The {{EX: ldif}} program (described in
401 Section 8.2.6) can be used to produce the LDIF format.
402
403 Note: Trailing spaces are not trimmed from values in an
404 LDIF file. Nor are multiple internal spaces compressed. If
405 you don't want them in your data, don't put them there.
406
407
408 H2: Converting from QUIPU EDB format to LDIF format
409
410 If you have directory data that is or was held in a QUIPU
411 DSA (available as part of the ISODE package), you will want
412 to convert the EDB files used by QUIPU into an LDIF file.
413 The edb2ldif program is provided to do most of the
414 conversion for you. Once you have an LDIF file, you should
415 follow the steps outlined in section 6.2 above to build an
416 LDBM database for slapd.
417
418
419
420 H3: The {{EX: edb2ldif}} program
421
422 The edb2ldif program is invoked like this:
423
424 E: edb2ldif [-d] [-v] [-r] [-o] [-b <basedn>]
425 E:      [-a <addvalsfile>] [-f <fileattrdir>]
426 E:      [-i <ignoreattr...>] [<edbfile...>]
427
428 The LDIF data is written to standard output. The arguments
429 have the following meanings:
430
431 E: -d
432
433 This option enables some debugging output on standard
434 error.
435
436 E: -v
437
438 Enable verbose mode that writes status information to
439 standard error, such as which EDB file is being processed,
440 how many entries have been converted so far, etc.
441
442 E: -r
443
444 Recurse through child directories, processing all EDB files
445 found.
446
447 E: -o
448
449 Cause local .add file definitions to override the global addfile
450 (see -a below)
451
452 E: -b <basedn>
453
454 Specify the Distinguished Name that all EDB file entries
455 appear below.
456
457 E: -a <addvalsfile>
458
459 The LDIF information contained in this file will be appended
460 to each entry.
461
462 E: -f <fileattrdir>
463
464 Specify a single directory where all file-based attributes
465 (typically sounds and images) can be found. If this option is
466 not given, file attributes are assumed to be located in the
467 same directory as the EDB file that refers to them.
468
469 E: -i <ignoreattr>
470
471 Specify an attribute that should not be converted. You can
472 include as many -i flags as necessary. 
473
474 E: <edbfile>
475
476 Specify a particular EDB file (or files) to read data from. By
477 default, the EDB.root (if it exists) and EDB files in the current
478 directory are used.
479
480 When {{EX: edb2ldif}} is invoked, it will also look for files named
481 .add in the directories where EDB files are found and append
482 the contents of the .add file to each entry. Typically, this
483 feature is used to include inherited attribute values (e.g.,
484 {{EX: objectClass}}) that do not appear in the EDB files.
485
486
487
488 H3: Step-by-step EDB to LDIF conversion
489
490 The basic steps to follow when converting your EDB format
491 data to an LDIF file are:
492
493 ^ Locate the directory at the top of the EDB file hierarchy
494 that your QUIPU DSA masters. The EDB file located there
495 should contain the entries for the first level of your
496 organization or organizational unit. If you are using an
497 indexed database with QUIPU, you may need to create EDB
498 files from your index files (using the synctree or qb2edb
499 tools).
500
501
502 + If you do not have a file named EDB.root in the same
503 directory that contains your organizational or organizational
504 unit entry, create it now by hand. Its contents should look
505 something like this:
506
507 .{{EX:  MASTER}}
508 .{{EX:  000001}}
509 .{{EX:  }}
510 .{{EX:  o=OpenLDAP}}
511 .{{EX:  objectClass= top & organization & domainRelatedObject &\}}
512 .{{EX:  quipuObject & quipuNonLeafObject}}
513 .{{EX:  l= Redwood City, California}}
514 .{{EX:  st= California}}
515 .{{EX:  o=OpenLDAP Project & OpenLDAP Foundation & OpenLDAP}}
516 .{{EX:  description=The OpenLDAP Project}}
517 .{{EX:  associatedDomain= openldap.org}}
518 .{{EX:  masterDSA= c=US@cn=Woolly Monkey}}
519 .{{EX:  }}
520
521 + (Optional) Create a global add file and/or local .add files to
522 take care of adding any attribute values that do not appear in
523 the EDB files. For example, if all entries in a particular EDB
524 are person entries and you want to add the appropriate
525 objectClass attribute value for them, create a file called .add
526 in the same directory as the person EDB that contains the
527 single line:
528
529 .{{EX:  objectClass: person }}
530
531
532 + Run the edb2ldif program to do the actual conversion.
533 Make sure you are in the directory that contains the root of
534 the EDB hierarchy (the one where the EDB.root file resides).
535 Include a -b flag with a base DN one level above your
536 organizational entry, and include -i flags to ignore any
537 attributes that are not useful to slapd. E.g., the command:
538  
539 .{{EX:  edb2ldif -v -r -b "c=US" -i iattr -i acl -i xacl -i sacl}}
540 .{{EX:          -i lacl -i masterDSA -i slaveDSA > ldif}}
541
542 will convert the entire EDB hierarchy to LDIF format and
543 write the result to a file named ldif. Some attributes that are
544 not useful when running slapd are ignored. The EDB
545 hierarchy is assumed to reside logically below the base DN
546 "c=US".
547
548 + Follow the steps outlined in section 8.2 above to produce
549 an LDBM database from your new LDIF file.
550
551
552
553 H2: The ldbmtest program
554
555 Occasionally you may find it useful to look at the LDBM
556 database and index files directly (i.e., without going through
557 slapd). The {{EX: ldbmtest}} program is provided for this purpose. It
558 gives you raw access to the database itself. {{EX: ldbmtest}} should
559 be run line this:
560
561 E:      ldbmtest [-d <debuglevel>] [-f <slapdconfigfile>]
562
563 The default configuration file in the {{EX: ETCDIR}} is used if you
564 don't supply one. By default, ldbmtest operates on the last
565 database listed in the config file. You can specify an
566 alternate database, or see the current database with the
567 following commands.
568
569 E:      b specify an alternate backend database
570 E:      B print out the current backend database
571
572 The {{EX: b}} command will prompt you for the suffix associated with
573 the database you want. The database you select can be
574 viewed and modified using a set of two-letter commands.
575 The first letter selects the command function to perform.
576 Possible commands and their meanings are as follows.
577
578 E:      l lookup (do not follow indirection)
579 E:      L lookup (follow indirection)
580 E:      t traverse and print keys and data
581 E:      T traverse and print keys only
582 E:      x delete an index item
583 E:      e edit an index item
584 E:      a add an index item
585 E:      c create an index file
586 E:      i insert an entry into an index item
587
588 The second letter indicates which index the command
589 applies to. The possible index selections are as follows.
590
591 E:      c id2children index
592 E:      d dn2id index
593 E:      e id2entry index
594 E:      f arbitrary file name
595 E:      i attribute index
596
597 Each command may require additional arguments which
598 ldbmtest will prompt you for.
599
600 To exit {{EX: ldbmtest}}, type {{EX: control-D}} or {{EX: control-C}}.
601
602 Note that this is a very raw interface originally developed
603 when testing the database format. It is provided and
604 minimally documented here for interested parties, but it is not
605 meant to be used by the inexperienced. See the next section
606 for a brief description of the LDBM database format.
607
608
609
610 H2: The LDBM database format
611
612 In normal operation, it is not necessary for you to know much
613 about the LDBM database format. If you are going to use the
614 ldbmtest program to look at or alter the database, or if you
615 want a deeper understanding of how indexes are maintained,
616 some knowledge of how it works could be useful. This
617 section gives an overview of the database format and how
618 slapd makes use of it.
619
620
621
622 H3: Overview
623
624 The LDBM database works by assigning a compact
625 four-byte unique identifier to each entry in the database. It
626 uses this identifier to refer to entries in indexes. The
627 database consists of one main index file, called id2entry,
628 which maps from an entry's unique identifier (EID) to a text
629 representation of the entry itself. Other index files are
630 maintained, for each indexed attribute for example, that map
631 values people are likely to search on to lists of EIDs.
632
633 Using this simple scheme, many LDAP queries can be
634 answered efficiently. For example, to answer a search for
635 entries with a surname of "Jensen", slapd would first consult
636 the surname attribute index, look up the value "Jensen" and
637 retrieve the corresponding list of EIDs. Next, slapd would
638 look up each EID in the id2entry index, retrieve the
639 corresponding entry, convert it from text to LDAP format, and
640 return it to the client.
641
642 The following sections give a very brief overview of each
643 type of index and what it contains. For more detailed
644 information see the paper "An X.500 and LDAP Database:
645 Design and Implementation," available in postscript format
646 from
647 {{URL:ftp://terminator.rs.itd.umich.edu/ldap/papers/xldbm.ps}}
648
649
650 H3: Attribute index format
651
652 The LDBM backend will maintain one index file for each
653 attribute it is asked to index. Several sets of keys must
654 coexist in this file (e.g., keys for equality and approximate
655 equality), so the keys are prefixed with a character to ensure
656 uniqueness. The prefixes are given in the table below
657
658 E:      = equality keys
659 E:      ~ approximate equality keys
660 E:      * substring equality keys
661 E:      \ continuation keys
662
663 Key values are also normalized (e.g., converted to upper
664 case for case ignore attributes). So, for example, to look up
665 the surname equality value in the example above using the
666 ldbmtest program, you would look up the value "{{EX: =JENSEN}}".
667
668 Substring indexes are maintained by generating all possible
669 N-character substrings for a value (N is 3 by default). These
670 substrings are then stored in the attribute index, prefixed by
671 "*". Additional anchors of "^" and "$" are added at the
672 beginning and end of words. So, for example the surname of
673 Jensen would cause the following keys to be entered in the
674 index: {{EX: ^JE, JEN, ENS, NSE, SEN, EN$}}.
675
676 Approximate values are handled in a similar way, with
677 phonetic codes being generated for each word in a value
678 and then stored in the index, prefixed by "~".
679
680 Large blocks in the index are split into smaller ones. The
681 smaller blocks are accessed through a level of indirection
682 provided by the original block. They are stored in the index
683 using the continuation key prefix of "\".
684
685
686
687 H3: Other indexes
688
689 In addition to the {{EX: id2entry}} and attribute indexes, LDBM
690 maintains a number of other indexes, including the {{EX: dn2id}}
691 index and the {{EX: id2children}} index. These indexes provide the
692 mapping between a DN and the corresponding EID, and the
693 mapping between an EID and the EIDs of the corresponding
694 entry's children, respectively.
695
696 The {{EX: dn2id}} index stores normalized DNs as keys. The data
697 stored is the corresponding EID.
698
699 The {{EX: id2children}} index stores EIDs as keys. The data stored
700 is a list of EIDs, just as for the attribute indexes.
701
702