Exemple #1
0
    def __repair_db(self, obj):
        """
        Start the repair process by calling the start_editing option on 
        the line with the cursor.
        """
        store, node = self.selection.get_selected()
        dirname = store[node][1]

        #First ask user if he is really sure :-)
        yes_no = QuestionDialog2(
            _("Repair family tree?"),
            _("If you click <b>Proceed</b>, Gramps will attempt to recover your family tree"
              " from the last good backup. There are several ways this can cause unwanted"
              " effects, so <b>backup</b> the family tree first.\n"
              "The Family tree you have selected is stored in %s.\n\n"
              "Before doing a repair, verify that the Family Tree can really no longer be "
              " opened, as the database back-end can recover from some errors automatically.\n\n"
              "<b>Details:</b> Repairing a Family Tree actually uses the last backup of"
              " the Family Tree, which Gramps stored on last use. If you have worked for"
              " several hours/days without closing Gramps, then all this information will"
              " be lost! If the repair fails, then the original family tree will be lost"
              " forever, hence a backup is needed. If the repair fails, or too much"
              " information is lost, you can fix the original family tree manually."
              " For details, see the webpage\n"
              "http://gramps-project.org/wiki/index.php?title=Recover_corrupted_family_tree\n"
              "Before doing a repair, try to open the family tree in the normal manner."
              " Several errors that trigger the repair button can be fixed automatically."
              " If this is the case, you can disable the repair button by removing the"
              " file <i>need_recover</i> in the family tree directory.") %
            dirname, _("Proceed, I have taken a backup"), _("Stop"))
        prompt = yes_no.run()
        if not prompt:
            return

        opened = store[node][OPEN_COL]
        if opened:
            self.dbstate.no_database()

        # delete files that are not backup files or the .txt file
        for filename in os.listdir(dirname):
            if os.path.splitext(filename)[1] not in (".gbkp", ".txt"):
                fname = os.path.join(dirname, filename)
                os.unlink(fname)

        newdb = DbBsddb()
        newdb.write_version(dirname)

        dbclass = DbBsddb
        dbase = dbclass()
        dbase.set_save_path(dirname)
        dbase.load(dirname, None)

        self.__start_cursor(_("Rebuilding database from backup files"))

        try:
            restore(dbase)
        except DbException, msg:
            DbManager.ERROR(_("Error restoring backup data"), msg)