Re: [Fedora-directory-users] Deleting database

Richard Megginson
2007-03-23T13:21:46Z

Ville Silventoinen wrote:
> On Thu, 22 Mar 2007, Richard Megginson wrote:
>
>> Ville Silventoinen wrote:
>>> I''m using Fedora DS 1.0.4. I''ve written an
application that uses
>>> Fedora DS and next I''m planning to write unit tests.
I''m wondering
>>> if there is a way to delete the whole userRoot database and create
>>> it again? I searched the documentation and there seems to be a way
>>> to create the database from command line, but no way to delete it,
>>> except from the GUI?
>> Just delete the entry (e.g. delete cn=userRoot,cn=ldbm
>> database,cn=plugins,cn=config).  You will have to do some sort of
>> recursive deletion to remove all of the child entries.  I think this
>> is what the GUI does - just check the access logs for the server
>> after deleting the database in the console.
>
> Thank you Richard, that worked very well. I also delete the mapping
> tree entry, which maps the suffix to the backend database:
>
>   dn: cn="dc=ebi,dc=ac,dc=uk",cn=mapping tree,cn=config
>   objectclass: top
>   objectclass: extensibleObject
>   objectclass: nsMappingTree
>   nsslapd-state: backend
>   nsslapd-backend: userRoot
>   cn: dc=ebi,dc=ac,dc=uk
>
> The GUI works slightly differently, it sets nsslapd-state to
> "disabled" and removes the nsslapd-backend attribute.
>
> If anyone has a need for a script that can delete and create a
> database, I can send it to the list. I use Python with python-ldap
> package.
>
> Thank you very much for a fast response!
If you just want to restore the database to it''s initial state, you can
just do an import - ldif2db or ldif2db.pl - this will remove the
previous contents and create a new database.  This might be sufficient
for your purposes, without having to delete the database and mapping
tree entries.  See ldif2db.pl for how to invoke an import operation via
ldap - you can do something similar in python-ldap:

    def startTaskAndWait(self,entry,verbose=False):
        # start the task
        dn = entry.dn
        self.add_s(entry)
        entry = self.getEntry(dn, ldap.SCOPE_BASE)
        if not entry:
            if verbose:
                print "Entry %s was added successfully, but I cannot
search it" % dn
                return -1
        elif verbose:
            print entry

        # wait for task completion - task is complete when the
nsTaskExitCode attr is set
        attrlist = [''nsTaskLog'',
''nsTaskStatus'', ''nsTaskExitCode'',
''nsTaskCurrentItem'', ''nsTaskTotalItems'']
        done = False
        exitCode = 0
        while not done:
            time.sleep(1)
            entry = self.getEntry(dn, ldap.SCOPE_BASE,
"(objectclass=*)", attrlist)
            if verbose:
                print entry
            if entry.nsTaskExitCode:
                exitCode = int(entry.nsTaskExitCode)
                done = True
        return exitCode

    def importLDIF(self,file,suffix,be=None,verbose=False):
        cn = "import" + str(int(time.time()));
        dn = "cn=%s, cn=import, cn=tasks, cn=config" % cn
        entry = Entry(dn)
        entry.setValues(''objectclass'',
''top'', ''extensibleObject'')
        entry.setValues(''cn'', cn)
        entry.setValues(''nsFilename'', file)
        if be:
            entry.setValues(''nsInstance'', be)
        else:
            entry.setValues(''nsIncludeSuffix'', suffix)

        rc = self.startTaskAndWait(entry, verbose)

        if rc:
            if verbose:
                print "Error: import task %s for file %s exited with
%d"
% (cn,file,rc)
        else:
            if verbose:
                print "Import task %s for file %s completed
successfully" % (cn,file)
        return rc


>
> Ville