Mercurial > hg > classical
view common/FeatureFileIndex.cpp @ 44:ed2befdf1e98
* Index for feature files (e.g. generated by Sonic Annotator)
author | Chris Cannam |
---|---|
date | Mon, 10 May 2010 17:33:00 +0100 |
parents | |
children | 0033259c6772 |
line wrap: on
line source
/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ #include "FeatureFileIndex.h" #include "TypeRegistrar.h" #include <QMutexLocker> #include <QDir> #include "base/TempDirectory.h" #include "base/Exceptions.h" using namespace Dataquay; namespace ClassicalData { FeatureFileIndex * FeatureFileIndex::getInstance() { static FeatureFileIndex instance; return &instance; } FeatureFileIndex::FeatureFileIndex() : m_index(0) { try { m_indexFileName = getIndexFileName(); } catch (DirectoryCreationFailed f) { std::cerr << "FeatureFileIndex: ERROR: Failed to find or create index directory: " << f.what() << std::endl; return; } m_index = new BasicStore; TypeRegistrar::addMappings(m_index, 0); if (QFile(m_indexFileName).exists()) { m_index->import(QUrl::fromLocalFile(m_indexFileName), BasicStore::ImportIgnoreDuplicates); //!!! catch } } FeatureFileIndex::~FeatureFileIndex() { } QString FeatureFileIndex::getIndexFileName() { QDir d = TempDirectory::getInstance()->getContainingPath(); QString n("index"); QFileInfo fi(d.filePath(n)); if ((fi.exists() && !fi.isDir()) || (!fi.exists() && !d.mkdir(n))) { throw DirectoryCreationFailed(fi.filePath()); } return QDir(fi.filePath()).filePath("features.ttl"); } QString FeatureFileIndex::getFeatureDirectoryName() { QDir d = TempDirectory::getInstance()->getContainingPath(); QString n("features"); QFileInfo fi(d.filePath(n)); if ((fi.exists() && !fi.isDir()) || (!fi.exists() && !d.mkdir(n))) { throw DirectoryCreationFailed(fi.filePath()); } return fi.filePath(); } void FeatureFileIndex::loadFor(TrackFile *tf, BasicStore *store) { if (!m_index) { std::cerr << "FeatureFileIndex::loadFor: No index!" << std::endl; return; } updateIndex(); //... } void FeatureFileIndex::updateIndex() { QMutexLocker locker(&m_mutex); if (!m_index) return; QDir featureDir; try { QString s = getFeatureDirectoryName(); featureDir = QDir(s); } catch (DirectoryCreationFailed f) { std::cerr << "FeatureFileIndex::updateIndex: ERROR: Failed to find or create feature directory: " << f.what() << std::endl; return; } featureDir.setFilter(QDir::Files); for (unsigned int i = 0; i < featureDir.count(); ++i) { QFileInfo fi(featureDir.filePath(featureDir[i])); if (fi.isFile() && fi.isReadable()) { QUrl fileUrl(QUrl::fromLocalFile(fi.filePath())); try { BasicStore *b = BasicStore::load(fileUrl); Triples ts = b->match (Triple(Node(), "a", m_index->expand("mo:AudioFile"))); foreach (Triple t, ts) { m_index->add(Triple(Uri(fileUrl), "a", m_index->expand("foaf:Document"))); m_index->add(Triple(Uri(fileUrl), "foaf:primaryTopic", t.a));; } } catch (...) { } } } //!!! remove triples from index that refer to nonexistent files? std::cerr << "Saving index to " << m_indexFileName.toStdString() << std::endl; m_index->save(m_indexFileName); } }