[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