DBStatDlg::DBStatDlg(QWidget* const parent) : InfoDlg(parent) { qApp->setOverrideCursor(Qt::WaitCursor); setWindowTitle(i18n("Database Statistics")); listView()->setHeaderLabels(QStringList() << i18n("Format") << i18n("Count")); // get image format statistics int totalImages = generateItemsList(DatabaseItem::Image, i18n("Images")); int totalVideos = generateItemsList(DatabaseItem::Video, i18n("Videos")); int totalAudio = generateItemsList(DatabaseItem::Audio, i18n("Audio")); int total = totalImages + totalVideos + totalAudio; // -------------------------------------------------------- // To see total count of items at end of list. new QTreeWidgetItem(listView(), QStringList() << i18n("Total Items") << QString::number(total)); // get album statistics int albums = CoreDbAccess().db()->scanAlbums().count(); new QTreeWidgetItem(listView(), QStringList() << i18n("Albums") << QString::number(albums)); // get tags statistics int tags = CoreDbAccess().db()->scanTags().count(); new QTreeWidgetItem(listView(), QStringList() << i18n("Tags") << QString::number(tags)); // Database Backend information new QTreeWidgetItem(listView(), QStringList()); DbEngineParameters prm = ApplicationSettings::instance()->getDbEngineParameters(); QString dbBe = prm.databaseType; new QTreeWidgetItem(listView(), QStringList() << i18n("Database backend") << dbBe); if (dbBe == QLatin1String("QSQLITE")) { new QTreeWidgetItem(listView(), QStringList() << i18n("Database Path") << prm.getCoreDatabaseNameOrDir()); } else { if (prm.internalServer) { new QTreeWidgetItem(listView(), QStringList() << i18n("Database internal server") << i18n("Yes")); new QTreeWidgetItem(listView(), QStringList() << i18n("Database internal server Path") << prm.internalServerDBPath); } else { new QTreeWidgetItem(listView(), QStringList() << i18n("Host Name") << prm.hostName); new QTreeWidgetItem(listView(), QStringList() << i18n("Host Port") << QString::number(prm.port)); new QTreeWidgetItem(listView(), QStringList() << i18n("User account") << prm.userName); new QTreeWidgetItem(listView(), QStringList() << i18n("Connect options") << prm.connectOptions); new QTreeWidgetItem(listView(), QStringList() << i18n("Core Db name") << prm.databaseNameCore); new QTreeWidgetItem(listView(), QStringList() << i18n("Thumbs Db name") << prm.databaseNameThumbnails); new QTreeWidgetItem(listView(), QStringList() << i18n("Face Db name") << prm.databaseNameFace); } } qApp->restoreOverrideCursor(); }
void ItemScanner::commitItemInformation() { if (d->scanMode == NewScan) { CoreDbAccess().db()->addItemInformation(d->scanInfo.id, d->commit.imageInformationInfos, d->commit.imageInformationFields); } else // d->scanMode == Rescan or d->scanMode == ModifiedScan { CoreDbAccess().db()->changeItemInformation(d->scanInfo.id, d->commit.imageInformationInfos, d->commit.imageInformationFields); } }
bool ItemScanner::scanFromIdenticalFile() { // Get a list of other images that are identical. Source image shall not be included. // When using the Commit functionality, d->scanInfo.id can be null. QList<ItemScanInfo> candidates = CoreDbAccess().db()->getIdenticalFiles(d->scanInfo.uniqueHash, d->scanInfo.fileSize, d->scanInfo.id); if (!candidates.isEmpty()) { // Sort by priority, as implemented by custom lessThan() std::stable_sort(candidates.begin(), candidates.end(), lessThanForIdentity); qCDebug(DIGIKAM_DATABASE_LOG) << "Recognized" << d->fileInfo.filePath() << "as identical to item" << candidates.first().id; // Copy attributes. // Todo for the future is to worry about syncing identical files. d->commit.copyImageAttributesId = candidates.first().id; return true; } return false; }
void ImageLister::listAlbum(ImageListerReceiver* const receiver, int albumRootId, const QString& album) { if (d->listOnlyAvailableImages) { if (!CollectionManager::instance()->locationForAlbumRootId(albumRootId).isAvailable()) { return; } } QList<QVariant> albumIds; if (d->recursive) { QList<int> intAlbumIds = CoreDbAccess().db()->getAlbumAndSubalbumsForPath(albumRootId, album); if (intAlbumIds.isEmpty()) { return; } foreach(int id, intAlbumIds) { albumIds << id; } }
void ItemScanner::commitUpdateImage() { CoreDbAccess().db()->updateItem(d->scanInfo.id, d->scanInfo.category, d->scanInfo.modificationDate, d->scanInfo.fileSize, d->scanInfo.uniqueHash); }
void SetupMime::readSettings() { QString image, audio, video; CoreDbAccess().db()->getUserFilterSettings(&image, &video, &audio); d->imageFileFilterEdit->setText(image); d->movieFileFilterEdit->setText(video); d->audioFileFilterEdit->setText(audio); }
void SetupMime::slotShowCurrentAudioSettings() { QStringList audioList; CoreDbAccess().db()->getFilterSettings(0, 0, &audioList); QString text = i18n("<p>Files with these extensions will be recognized as audio files " "and included into the database:<br/> <code>%1</code></p>", audioList.join(QLatin1String(" "))); QWhatsThis::showText(d->audioFileFilterLabel->mapToGlobal(QPoint(0, 0)), text, d->audioFileFilterLabel); }
void checkInfos() { if (needUpdateInfos && initialized) { QList<TagShortInfo> newInfos = CoreDbAccess().db()->getTagShortInfos(); QWriteLocker locker(&lock); infos = newInfos; needUpdateInfos = false; } }
void ItemExtendedProperties::setFakeListProperty(const QString& property, const QStringList& value) { if (value.isEmpty()) { removeProperty(property); } else { CoreDbAccess().db()->setImageProperty(m_id, property, value.join(QLatin1Char(';'))); } }
void ItemExtendedProperties::setProperty(const QString& property, const QString& value) { if (value.isNull()) // there is a NOT NULL restriction on the table. { removeProperty(property); } else { CoreDbAccess().db()->setImageProperty(m_id, property, value); } }
void GPSSearchView::showNonGeolocatedItems() { if(d->nonGeonlocatedItemsXml.isEmpty()) { SearchXmlWriter writer; writer.setFieldOperator((SearchXml::standardFieldOperator())); writer.writeGroup(); writer.writeField(QLatin1String("nogps"), SearchXml::Equal); writer.finishField(); writer.finishGroup(); writer.finish(); d->nonGeonlocatedItemsXml = writer.xml(); } QString title = SAlbum::getTemporaryTitle(DatabaseSearch::MapSearch); SAlbum* album = AlbumManager::instance()->findSAlbum(title); int id; if(album) { id = album->id(); CoreDbAccess().db()->updateSearch(id,DatabaseSearch::AdvancedSearch, SAlbum::getTemporaryTitle(DatabaseSearch::AdvancedSearch), d->nonGeonlocatedItemsXml); } else { id = CoreDbAccess().db()->addSearch(DatabaseSearch::AdvancedSearch, SAlbum::getTemporaryTitle(DatabaseSearch::AdvancedSearch), d->nonGeonlocatedItemsXml); } album = new SAlbum(i18n("Non Geo-located Items"), id); if(album) { AlbumManager::instance()->setCurrentAlbums(QList<Album*>() << album); } }
CoreDbDownloadHistory::Status CoreDbDownloadHistory::status(const QString& identifier, const QString& name, qlonglong fileSize, const QDateTime& date) { int id = CoreDbAccess().db()->findInDownloadHistory(identifier, name, fileSize, date); if (id != -1) { return Downloaded; } else { return NotDownloaded; } }
int DBStatDlg::generateItemsList(DatabaseItem::Category category, const QString& title) { // get image format statistics QMap<QString, int> stat = CoreDbAccess().db()->getFormatStatistics(category); // do not add items if the map is empty if (stat.isEmpty()) { return 0; } int total = 0; QMap<QString, QString> map; for (QMap<QString, int>::const_iterator it = stat.constBegin(); it != stat.constEnd(); ++it) { total += it.value(); map.insert(it.key(), QString::number(it.value())); } // -------------------------------------------------------- QTreeWidgetItem* ti = new QTreeWidgetItem(listView(), QStringList() << title << QString()); QFont ft = ti->font(0); ft.setBold(true); ti->setFont(0, ft); ti->setFont(1, ft); setInfoMap(map); ti = new QTreeWidgetItem(listView(), QStringList() << i18n("total") << QString::number(total)); ti->setFont(0, ft); ti->setFont(1, ft); // Add space. new QTreeWidgetItem(listView(), QStringList()); return total; }
QStringList ItemExtendedProperties::readFakeListProperty(const QString& property) { QString value = CoreDbAccess().db()->getImageProperty(m_id, property); return value.split(QLatin1Char(';'), QString::SkipEmptyParts); }
QString ItemExtendedProperties::readProperty(const QString& property) { return CoreDbAccess().db()->getImageProperty(m_id, property); }
void ItemScanner::scanFile(ScanMode mode) { d->scanMode = mode; if (d->scanMode == ModifiedScan) { if (d->scanInfo.category == DatabaseItem::Image) { scanItemInformation(); scanImageHistoryIfModified(); } else if (d->scanInfo.category == DatabaseItem::Video || d->scanInfo.category == DatabaseItem::Audio) { scanVideoInformation(); // NOTE: Here, we only scan fields which can be expected to have changed, when we detect a change of file data. // It seems to me that at the moment video metadata contains such fields (which may change after editing). // In contrast, with photos, ImageMetadata contains fields which describe the moment of taking the photo, // which means they don't change. if (d->hasMetadata) { scanVideoMetadata(); } } else if (d->scanInfo.category == DatabaseItem::Other) { // unsupported } } else { if (d->scanMode == Rescan && d->scanInfo.id != -1 && MetaEngineSettings::instance()->settings().clearMetadataIfRescan) { CoreDbAccess().db()->clearMetadataFromImage(d->scanInfo.id); } if (d->scanInfo.category == DatabaseItem::Image) { scanItemInformation(); if (d->hasMetadata) { scanImageMetadata(); scanItemPosition(); scanItemComments(); scanItemCopyright(); scanIPTCCore(); scanTags(); scanFaces(); scanImageHistory(); scanBalooInfo(); } } else if (d->scanInfo.category == DatabaseItem::Video || d->scanInfo.category == DatabaseItem::Audio) { scanVideoInformation(); if (d->hasMetadata) { scanVideoMetadata(); scanItemPosition(); scanItemComments(); scanItemCopyright(); scanIPTCCore(); scanTags(); } } else if (d->scanInfo.category == DatabaseItem::Other) { // unsupported } } }
void CoreDbDownloadHistory::setDownloaded(const QString& identifier, const QString& name, qlonglong fileSize, const QDateTime& date) { CoreDbAccess().db()->addToDownloadHistory(identifier, name, fileSize, date); }
void ItemExtendedProperties::removeProperty(const QString& property) { CoreDbAccess().db()->removeImageProperty(m_id, property); }
void ThumbsGenerator::slotStart() { MaintenanceTool::slotStart(); QApplication::setOverrideCursor(Qt::WaitCursor); if (d->albumList.isEmpty()) { d->albumList = AlbumManager::instance()->allPAlbums(); } for (AlbumList::const_iterator it = d->albumList.constBegin(); !canceled() && (it != d->albumList.constEnd()); ++it) { if (!(*it)) { continue; } if ((*it)->type() == Album::PHYSICAL) { d->allPicturesPath += CoreDbAccess().db()->getItemURLsInAlbum((*it)->id()); } else if ((*it)->type() == Album::TAG) { d->allPicturesPath += CoreDbAccess().db()->getItemURLsInTag((*it)->id()); } } if (!d->rebuildAll) { QHash<QString, int> filePaths = ThumbsDbAccess().db()->getFilePathsWithThumbnail(); QStringList::iterator it = d->allPicturesPath.begin(); while (it != d->allPicturesPath.end()) { if (filePaths.contains(*it)) { it = d->allPicturesPath.erase(it); } else { ++it; } } } // remove non-image or video files from the list QStringList::iterator it = d->allPicturesPath.begin(); while (it != d->allPicturesPath.end()) { ItemInfo info = ItemInfo::fromLocalFile(*it); if (info.category() != DatabaseItem::Image && info.category() != DatabaseItem::Video && info.category() != DatabaseItem::Audio) { it = d->allPicturesPath.erase(it); } else { ++it; } } QApplication::restoreOverrideCursor(); if (d->allPicturesPath.isEmpty()) { slotDone(); return; } setTotalItems(d->allPicturesPath.count()); d->thread->generateThumbs(d->allPicturesPath); d->thread->start(); }