[KPhotoAlbum] Keywords with id=0?

Tobias Leupold tobias.leupold at gmx.de
Sun Dec 15 16:13:51 GMT 2019


Hey, nice work :-) Thanks for tracking this down! Your approach seems
reasonable to me. I'll try it out asap.

Am Sonntag, 15. Dezember 2019, 17:09:02 CET schrieben Sie:
> On Sun, 15 Dec 2019 10:17:34 +0100, Tobias Leupold wrote:
> > Okay. After being able to reproduce this and reading the code for quite a
> > long time, I must admit that I have no idea how or why this happens.
> > Maybe somebody with more clue about KPA's internals has? Johannes?!
>
> OK, found it.  The problem is in XMLDB::XMLCategory::renameItem().
>
> Background: IDs are normally only assigned in
> XMLDB::XMLCategory::initIdMap(), which is called from void
> XMLDB::XMLCategoryCollection::initIdMap(), which is only called from
> XMLDB::FileWriter::save().  So IDs are only assigned when the index
> file is saved.  So if you're trying to hunt down where an ID is
> assigned when you add an item, the search will be fruitless.  However,
> the IDs do persist for the life of the session, so that any IDs that
> are assigned will remain.
>
> Next, idForMap simply returns
>
> m_idMap[name]
>
> What happens if name is not present in a qMap?  It returns a default
> constructed value, which in this case is a default int, which is 0.
> But rename() always sets the id mapping for the new name, even if one
> previously didn't exist.  So when you rename something, the new name
> always gets the value 0.
>
> There are a couple of ways of solving this.  One is what I'm doing
> here, for rename to not set the ID if it's zero, and more importantly
> refuse to set an ID of zero so that if something else tries to set it
> to 0 it will not succeed.  So strictly speaking the change to
> renameItem() isn't needed, but this will prevent an unneeded warning
> from being emitted.
>
> Perhaps we should improve checking in setIdMapping() and add
> removeIdMapping() too.
>
> In any case, if one of you could review this, I'll push it later today.
>
> diff --git a/XMLDB/XMLCategory.cpp b/XMLDB/XMLCategory.cpp
> index 712cc689..30e55cdb 100644
> --- a/XMLDB/XMLCategory.cpp
> +++ b/XMLDB/XMLCategory.cpp
> @@ -20,6 +20,7 @@
>  #include <DB/ImageDB.h>
>  #include <DB/MemberMap.h>
>  #include <Utilities/List.h>
> +#include "Logging.h"
>
>  XMLDB::XMLCategory::XMLCategory(const QString &name, const QString &icon,
> ViewType type, int thumbnailSize, bool show, bool positionable)
>      : m_name(name)
>
> @@ -130,7 +131,8 @@ void XMLDB::XMLCategory::renameItem(const QString
> &oldValue, const QString &newV m_idMap.remove(oldValue);
>
>      addItem(newValue);
> -    setIdMapping(newValue, id);
> +    if ( id != 0)
> +        setIdMapping(newValue, id);
>      emit itemRenamed(oldValue, newValue);
>  }
>
> @@ -179,8 +181,12 @@ void XMLDB::XMLCategory::initIdMap()
>
>  void XMLDB::XMLCategory::setIdMapping(const QString &name, int id)
>  {
> -    m_nameMap.insert(id, name);
> -    m_idMap.insert(name, id);
> +    if (id == 0) {
> +        qCWarning(XMLDBLog, "XMLDB::XMLCategory::setIdMapping attempting to
> set id for %s to invalid value %d", qPrintable(name), id); +    } else {
> +        m_nameMap.insert(id, name);
> +        m_idMap.insert(name, id);
> +    }
>  }
>
>  QString XMLDB::XMLCategory::nameForId(int id) const






More information about the Kphotoalbum mailing list