[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [digikam/development/imagemetadatacache] libs/database: Add caching of ImageMetadata.
From:       Michael Georg Hansen <mike () mghansen ! de>
Date:       2013-06-30 19:54:10
Message-ID: E1UtNhK-0001lj-5N () scm ! kde ! org
[Download RAW message or body]

Git commit 64688a7a108dd48a89c4a2709d18f351f4ed7dc5 by Michael Georg Hansen.
Committed on 30/06/2013 at 19:50.
Pushed by mghansen into branch 'development/imagemetadatacache'.

Add caching of ImageMetadata.

ImageInfo functions which return containers do not use it yet.

M  +44   -8    libs/database/imageinfo.cpp
M  +8    -0    libs/database/imageinfocache.cpp
M  +2    -0    libs/database/imageinfodata.h

http://commits.kde.org/digikam/64688a7a108dd48a89c4a2709d18f351f4ed7dc5

diff --git a/libs/database/imageinfo.cpp b/libs/database/imageinfo.cpp
index 1513234..f8a8ad4 100644
--- a/libs/database/imageinfo.cpp
+++ b/libs/database/imageinfo.cpp
@@ -128,7 +128,9 @@ ImageInfoData::ImageInfoData()
     invalid                = false;
 
     videoMetadataCached    = DatabaseFields::VideoMetadataNone;
+    imageMetadataCached    = DatabaseFields::ImageMetadataNone;
     hasVideoMetadata       = true;
+    hasImageMetadata       = true;
 }
 
 ImageInfoData::~ImageInfoData()
@@ -170,7 +172,9 @@ ImageInfo::ImageInfo(const ImageListerRecord& record)
     m_data->fileSizeCached         = m_data->fileSize != -1;
     m_data->imageSizeCached        = true;
     m_data->videoMetadataCached    = DatabaseFields::VideoMetadataNone;
+    m_data->imageMetadataCached    = DatabaseFields::ImageMetadataNone;
     m_data->hasVideoMetadata       = true;
+    m_data->hasImageMetadata       = true;
     m_data->databaseFieldsHashRaw.clear();
 
     if (newlyCreated)
@@ -1570,7 +1574,7 @@ ImageInfo::DatabaseFieldsHashRaw \
ImageInfo::getDatabaseFieldsRaw(const DatabaseF  ImageInfoReadLocker readLocker;
     if (requestedSet.hasFieldsFromVideoMetadata() && m_data->hasVideoMetadata)
     {
-        const DatabaseFields::VideoMetadata requestedVideoMetadata = requestedSet;
+        const DatabaseFields::VideoMetadata requestedVideoMetadata = \
requestedSet.getVideoMetadata();  
         const DatabaseFields::VideoMetadata missingVideoMetadata = \
                requestedVideoMetadata & ~m_data->videoMetadataCached;
         kDebug()<<QString("videometadata: requested: %1 missing: \
%3").arg(requestedVideoMetadata, 0, 16).arg(missingVideoMetadata, 0, 16); @@ -1600,6 \
+1604,38 @@ ImageInfo::DatabaseFieldsHashRaw ImageInfo::getDatabaseFieldsRaw(const \
DatabaseF  }
     }
 
+    if (requestedSet.hasFieldsFromImageMetadata() && m_data->hasImageMetadata)
+    {
+        const DatabaseFields::ImageMetadata requestedImageMetadata = \
requestedSet.getImageMetadata(); +
+        const DatabaseFields::ImageMetadata missingImageMetadata = \
requestedImageMetadata & ~m_data->imageMetadataCached; +        \
kDebug()<<QString("imagemetadata: requested: %1 missing: \
%3").arg(requestedImageMetadata, 0, 16).arg(missingImageMetadata, 0, 16); +        if \
(missingImageMetadata) +        {
+            const QVariantList fieldValues = \
DatabaseAccess().db()->getImageMetadata(m_data->id, missingImageMetadata); +
+            if (fieldValues.isEmpty())
+            {
+                m_data.constCastData()->hasImageMetadata = false;
+                m_data.constCastData()->databaseFieldsHashRaw.removeAllFields(DatabaseFields::ImageMetadataAll);
 +                m_data.constCastData()->imageMetadataCached = \
DatabaseFields::ImageMetadataNone; +            }
+            else
+            {
+                int fieldsIndex = 0;
+                for (DatabaseFields::ImageMetadataIteratorSetOnly \
it(missingImageMetadata); !it.atEnd(); ++it) +                {
+                    const QVariant fieldValue = fieldValues.at(fieldsIndex);
+                    ++fieldsIndex;
+
+                    m_data.constCastData()->databaseFieldsHashRaw.insertField(*it, \
fieldValue); +                }
+
+                m_data.constCastData()->imageMetadataCached|=missingImageMetadata;
+            }
+        }
+    }
+
     // We always return all fields, the caller can just retrieve the ones he needs.
     return m_data->databaseFieldsHashRaw;
 }
@@ -1608,13 +1644,13 @@ QVariant ImageInfo::getDatabaseFieldRaw(const \
DatabaseFields::Set& requestedFiel  {
     DatabaseFieldsHashRaw rawHash = getDatabaseFieldsRaw(requestedField);
 
-//     if (requestedField.hasFieldsFromImageMetadata())
-//     {
-//         const DatabaseFields::ImageMetadata requestedFieldFlag = requestedField;
-//         const QVariant value = rawHash.value(requestedFieldFlag);
-//
-//         return value;
-//     }
+    if (requestedField.hasFieldsFromImageMetadata())
+    {
+        const DatabaseFields::ImageMetadata requestedFieldFlag = requestedField;
+        const QVariant value = rawHash.value(requestedFieldFlag);
+
+        return value;
+    }
 
     if (requestedField.hasFieldsFromVideoMetadata())
     {
diff --git a/libs/database/imageinfocache.cpp b/libs/database/imageinfocache.cpp
index 053e9c0..59d2be7 100644
--- a/libs/database/imageinfocache.cpp
+++ b/libs/database/imageinfocache.cpp
@@ -317,6 +317,14 @@ void ImageInfoCache::slotImageChanged(const ImageChangeset& \
changeset)  
                 (*it)->databaseFieldsHashRaw.removeAllFields(changedVideoMetadata);
             }
+
+            if (changes.hasFieldsFromImageMetadata())
+            {
+                const DatabaseFields::ImageMetadata changedImageMetadata = \
changes.getImageMetadata(); +                \
(*it)->imageMetadataCached&=~changedImageMetadata; +
+                (*it)->databaseFieldsHashRaw.removeAllFields(changedImageMetadata);
+            }
         }
     }
 }
diff --git a/libs/database/imageinfodata.h b/libs/database/imageinfodata.h
index 8bdc04b..4067544 100644
--- a/libs/database/imageinfodata.h
+++ b/libs/database/imageinfodata.h
@@ -148,7 +148,9 @@ public:
     /// @todo Currently only 7 bits of VideoMetadataField are used,
     ///       we could store only a byte instead.
     DatabaseFields::VideoMetadata videoMetadataCached;
+    DatabaseFields::ImageMetadata imageMetadataCached;
     bool                   hasVideoMetadata       : 1;
+    bool                   hasImageMetadata       : 1;
 
     typedef DatabaseFields::Hash<QVariant> DatabaseFieldsHashRaw;
     DatabaseFieldsHashRaw databaseFieldsHashRaw;


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic