1.6.5
   * added a configure script generated with autoconf which aids
     portability
1.6.4
   * Fixed a typo (DOH!) in ooldap which could cause crashes in some
     rare cases when the library is not used exactly as intended.
1.6.3
   * Fixed a subtle bug in transparent reconnections which would
     occurr if your ldap server did not come back up fast after
     the connection failed. It would cause 
     LDAP_Failure `STRONG_AUTH_REQUIRED to be raised for every
     operation after the server went down. There are still some bugs
     which I have not found. Spesifically, it is not a good idea to
     call unbind, and then use the object again. I've gotten libldap
     to die with an ascertion failure from doing this. However so far
     I can't identify the pattern. This isn't really a supported operation,
     and it has been very stable otherwise.
1.6.2
   * The new map, and search_s routines were not being tail call
     optimized in the byte code environment. This made doing long
     searches in the toplevel loop impossible.
   * added a new method to ldapentry and subclasses. modify. Useful
     in many ways. It takes a regular Ocamldap modify structure, so
     it can help with migration. I think the most useful thing about it
     is that the changes method outputs an Ocamldap modify structure,
     so you can sync changes between entries by calling changes, and
     then using modify to move them to another entry.
1.6.1
   * fixed a bug in the new code. was not checking the result of
     ldap_result, which resulted in an ascert failure when the
     connection was dropped. It is supposed to generate an exception.
1.6.0
   * reimplemented the glue code for search. The new code uses the
     async calls, and has some efficency problems removed. The
     low level api is broken in a small way by this, the type of entry
     has changed. attributes are now a list, instead of an array. 
   * Added an async search call to the high level OO environment.
     search_a. It returns a function of type (unit -> ldapentry) which
     you can call to get your results. Also added iterator functions
     which are compatible with this new call. iter, map, rev_map, and
     fold. They take a (unit -> ldapentry) function, and a user supplied
     function and iterate just like the list operators. See the newly
     improved testoo.ml program.
   * Gutted the old build system and switched to OCamlMakefile for a
     better building experiance. Also, now actually build the glue code
     as a .so, so you don't need to build a custom toplevel in order to
     use ocamldap in it. Yaaaaah.
   * REMOVED the finalization function on ldapcon in the high level
     api.This was causing problems in that it would try to finalize the
     object whenever I returned a closure from one of it's methods. Caused
     many Bus Errors and Segfaults, took an hour with valgrind to actually
     figure out what was going on. found no work around, so. Release your
     ldap objects manually on pain of memory and fd leaks. sorry :(
   * Referrals are broken again! However, this is a step in the right
     direction, because I now have control over them. I'm going to be
     doing a lot of thinking about how to handle them. Right now
     if you have a referral in your directory you will get
     LDAP_Failure `LOCAL_ERROR at the end of your async search.
     You can just consider it success. This is what search_s does,
     all the iter functions will do it for you.
1.5.0
   * The library now depends on findlib, and ocamlnet. It will not
     compile without them.
   * added two new methods to ldapaccount service_exists, and
     services present, which allow the user to inspect what services
     are on an object.
   * Fixed a bug in ldapaccount. When computing whether it is possible
     to generate a dependancy of a generator it was not being taken
     into account whether the dependancy was allowed by the schema.
     ldapaccount, and scldapentry generally try to avoid adding
     objectclasses for you, because some attributes are allowed by
     so many objectclasses, and inference will pick the first one
     which allows the attribute. For things like "cn" you can end up
     with some very strange objectclasses on your objects. As a result
     attributes on which a generator is dependant, which could also
     be generated, but are not currently allowed, are no longer considered.
   * in the ldif parser added support for reading entries with base64
     values (Matthew Backes)
   * added a new method to ooldif, write_entry, which writes an
     entry to ldif with base64 support.
   * added two new methods to ooldif, to_string, and of_string to
     write an entry to an ldif string, and read an entry from an
     ldif string
   * added rudimentry support for referrals. Don't raise an exception
     when we get LDAP_REFERRAL back from ldap_search_s. It seems that
     openldap's libldap follows referrals transparently, which could be
     both good and bad. Either way, referrals will need futher invesigation.
1.4.6
   * fixed a bug in the ldif parser which prevented the last entry
     in an ldif file from being read.
   * fixed the ldif parser so that a file with just a dn is a valid
     ldif file.
   * added an unbind method to ldapcon, for explicit deallocation of
     sockets.
   * added a finalisation function to ldapcon which calls unbind.
     It IS safe to call unbind explicitly, the object will handle
     the case that it is unbound twice gracefully.
   * fixed a bug in delete service which could cause it not to delete
     all the attribute values that it should.
1.4.5
   * fixed a bug in transparent reconnections which would cause an
     infinite loop.
1.4.4
   * exposed an exception called "Cannot_sort_dependancies of string list" 
   which indicates that circular dependancies have been detected among
   the attributes of the list. The exception will be raised when calling
   the generate method of an ldapaccount
1.4.3
   * changed the way the delta between an object and a service is computed.
   Instead of always doing a case sensitive match of the attribute values
   we now look up the matching rule in the schema and try to apply something
   close. We currently understand objectIdentifierMatch, caseIgnoreMatch, and 
   caseExactIA5Match. I will probably add more later.
1.4.2
   * adds modrdn support in ooldap, which was horribly omitted previously
   * fixed a bug in the service code with respect to single valued
     attributes, and static service attributes. Previously, an object
     which needed to have a static attribute to satisfy a service would
     always get it be adding a second value. This won't work for single
     value attributes for obvious reasons. The fix is to check if the
     attribute is single valued, and if it is, replace it, otherwise, add it.
1.4.1
   * fixes a bug in the schema parser. X-.* attributes were not previously
     supported. 1.4.1 adds support for them.
1.4.0
   * added two new classes to the Ooldap module.
     - scldapentry understands the directory schema, and makes use of it
       in various ways. It is a subclass of ldapentry
     - ldapaccount is built on top of scldapentry. It understands the
       schema, and how to generate certian attributes (based on functions you
       give it). It also has a the ability to group attributes together into
       things it calls services, which can be added and removed atomically.
1.3.2
   * fixed massive memory leaks in the search C glue code
1.3.1
   * fixed some serious bugs in the C glue code which could cause
     the garbage collector to go nuts.
   * performance improvements in the way entry objects are arranged
     this will improve performance for searching, local modifications
     and the ldif parser. I haven't done another test, but the ldif
     parser spitting out entries is most likely just as fast as the
     engine (~26s for a 50MB ldif file on a PPC7450 800Mhz).
1.3.0
   * Added an rfc2252 schema parser, and an interface to grab schema's
     from the server, see ooldap.mli, the method schema. See
     schemaparser.ml for the structure of the record returned.
   * performance enhancements to the ldif parser, ~3x improvement in
     parseing speed. Native code can parse a 50MB ldif file in ~38 seconds,
     bytecode takes about 1m45s for the same file. Obviously different files
     yeild different results. There is further room for improvement in the
     building of the entry objects. The engine alone in native code parses
     the 50MB file in ~26 seconds, so the rest is the overhead of building the
     entry objects. All tests were performed on an 800Mhz G4.
   * Fixed a bug with update_entry which caused changes to be applied in
     reverse order. This often breaks the symantics when replace is involved.
1.2.0
   * Added support for transparently reconnecting to servers which
     have dropped the connection. Often servers will have an idle time out
     for connections. This is avaliable in the object oriented api only. It
     should create the illusion that the connection was never dropped. It
     can also be usefull in the case where one server in a failover cluster
     goes down. As long as something is there to take its place, the user
     of the api will never know that a server went down. This feature is
     experimental, but should work :). This is great for interactive
     sessions.
   * Added a standards compliant ldif parser. You can send it a
     stream of ldif, and by calling a method, get back an ldapentry
     object. See ooldif.mli for details. The known bugs are, its a bit
     slow, and it won't do anything with base64 encoded values. If you wish
     to decode them, do it yourself for now. Things of note, the
     parser is "picky" in that it tries to follow the rfc to the letter, it
     will generally not accept malformed ldif. Some users may consider that
     annoying, but we actually used it to find several errors in our
     directory server :), so it has advantages too.
   * Changed make dep to preprecess using cpp instead of camlp4o, due
     to strange undocumented changes in 3.07. I really need to look into
     this and fix it.
   * Changed the get_value method of ldapentry to raise Not_found
     instead of return the empty list when it is queried for an attribute
     which doesn't exist. Please complain if this annoys you.

1.1.2
    * Added a patch from Sylvain Le Gall to ease packaging for debian.
    * Added another patch from Sylvain Le Gall which adds support for
      making documentation with ocamldoc.

1.1.1
    * fixed the makefile to properly honor CFLAGS. This makes
      it possible to build on systems where the ldap libraries
      are in a nonstandard place
    * added findlib support. make install now installs a package
      called "ocamldap".

1.1.0
    * Eric Stokes has taken over maintanence of the project
    * added a new object oriented interface modeled after 
      Net::LDAP in perl.
    * added an optional argument to init which allows
      selection of the protocal version. It defaults to 3.

1.0
    * added fixes from Eric Stokes:
    * added make dep to build dependencies
    * modified print_entry to print more ldif like output
     (it does not break up long lines correctly yet)

0.3.1
    * added fixes from Eric Stokes:
    * updated varcc with the latest version from labgtk
    * fixed ocamldap_tags.var to work with the new varcc
    * changed build scripts to allow compilation under 3.06
    * added ifdefs to remove kerberos support if not avaliable

0.3
    * added kerberos binding methods
    * added modrdn methods
    * most function arguments are lists now
    * fixed crash bug in search_s
    
0.2
    * add, modify, and delete are implemented
    * all ldap error codes are supported with the help of varcc
    * silly bugs fixed in bind and unbind

0.1 
    * first Release
    * only synchronous searches are supported
