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