This is a multi-part message in MIME format. --------------AED2FFEE73F73B1613190B64 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit
h...@symas.com wrote: > The tool to generate the test LDIF is attached. It reads an LDIF containing > 500,000 users on stdin, and outputs the same LDIF, > with aliases interspersed, on stdout. > Slightly tweaked, creates the alias after the target entry. In case the server does referential integrity on loading. -- -- Howard Chu CTO, Symas Corp. http://www.symas.com Director, Highland Sun http://highlandsun.com/hyc/ Chief Architect, OpenLDAP http://www.openldap.org/project/ --------------AED2FFEE73F73B1613190B64 Content-Type: text/x-csrc; name="mkalias.c" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="mkalias.c" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define NUMUSERS 500000 #define NUMALIASES 30000 #define NUMSUBALIASES 435 #define SUFFIX "dc=example,dc=com" static const char ou1[] = "\ dn: ou=alias1," SUFFIX "\n\ objectclass: top\n\ objectclass: organizationalUnit\n\ ou: alias1\n"; static const char ou2[] = "\ dn: ou=alias2," SUFFIX "\n\ objectclass: top\n\ objectclass: organizationalUnit\n\ ou: alias2\n"; int qcmp(const void *a, const void *b) { const int *i = a, *j = b; return *i - *j; } int main() { char line[1024], dn[1024], *ou; int aliases[NUMALIASES]; int subaliases[NUMSUBALIASES]; int i; int nusers=0, naliases=0, nsubaliases=0, showalias=0; /* select a random subset of users to generate aliases */ srand(time(0L)); for (i=0; i<NUMALIASES; i++) { aliases[i] = rand() % NUMUSERS; } uniq1: qsort(aliases, NUMALIASES, sizeof(int), qcmp); /* make sure they're unique */ for (i=1; i<NUMALIASES; i++) { if (aliases[i-1] == aliases[i]) { aliases[i] = rand() % NUMUSERS; goto uniq1; } } /* select a random susbset of aliases for the target subtree */ for (i=0; i<NUMSUBALIASES; i++) { subaliases[i] = rand() % NUMALIASES; } uniq2: qsort(subaliases, NUMSUBALIASES, sizeof(int), qcmp); /* make sure they're unique */ for (i=1; i<NUMSUBALIASES; i++) { if (subaliases[i-1] == subaliases[i]) { subaliases[i] = rand() % NUMALIASES; goto uniq2; } } for (i=0; i<NUMSUBALIASES; i++) { subaliases[i] = aliases[subaliases[i]]; } /* read LDIF */ while (fgets(line, sizeof(line), stdin) != NULL) { if (line[0] == '#') continue; if (!strncmp(line, "dn: ", 4)) { /* we assume all users' DNs use uid for RDN */ if (!strncmp(line+4, "uid=", 4)) { if (!nusers) { puts(ou1); puts(ou2); } if (showalias) { printf("dn: uid=x.%d,ou=%s," SUFFIX "\n", nusers, ou); puts("objectclass: alias"); puts("objectclass: extensibleObject"); printf("aliasedObjectName: %s\n", dn); showalias = 0; } if (nusers == aliases[naliases] || nusers == subaliases[nsubaliases]) { if (nusers == subaliases[nsubaliases]) { ou = "alias2"; nsubaliases++; } else { ou = "alias1"; } naliases++; strcpy(dn, line+4); showalias = 1; } nusers++; } } fputs(line, stdout); } return 0; } --------------AED2FFEE73F73B1613190B64--