summaryrefslogtreecommitdiff
path: root/media/mediaManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'media/mediaManager.cpp')
-rw-r--r--media/mediaManager.cpp56
1 files changed, 43 insertions, 13 deletions
diff --git a/media/mediaManager.cpp b/media/mediaManager.cpp
index c61a7ae..3768ae4 100644
--- a/media/mediaManager.cpp
+++ b/media/mediaManager.cpp
@@ -776,31 +776,61 @@ bool cMediaManager::ScanURI(const string& uri, cUPnPResourceProvider* provider){
}
StringList entries = provider->GetContainerEntries(uri);
- stringstream ss, uristrm;
+ stringstream ss;
- ss << "DELETE FROM " << db::Metadata << " WHERE "
- << " `" << property::object::KEY_PARENTID << "`"
- << " = '" << tools::GenerateUUIDFromURL(uri) << "'";
+ ss << "SELECT `" << property::object::KEY_OBJECTID << "` FROM " << db::Metadata
+ << " WHERE `" << property::object::KEY_PARENTID << "` = :parentID";
- for(StringList::iterator it = entries.begin(); it != entries.end(); ++it){
- uristrm.str(string());
- uristrm << uri << *it;
- ss << " AND"
- << " `" << property::object::KEY_OBJECTID << "`"
- << " != '" << tools::GenerateUUIDFromURL(uristrm.str()) << "'";
- }
+ StringList intersection;
try {
tntdb::Statement objects = connection.prepare(ss.str());
+ objects.setString("parentID", tools::GenerateUUIDFromURL(uri));
+
+ StringList::iterator rit;
+ string deletableID, entryID;
+ for(tntdb::Statement::const_iterator dit = objects.begin(); dit != objects.end(); ++dit){
+ tntdb::Row row = (*dit);
+ deletableID = row.getString(property::object::KEY_OBJECTID);
+ for(rit = entries.begin(); rit != entries.end(); ++rit){
+ entryID = tools::GenerateUUIDFromURL(uri + (*rit));
+ if(entryID.compare(deletableID) == 0) break;
+ }
+ if(rit == entries.end())
+ intersection.push_back(deletableID);
+ }
- objects.execute();
} catch (const std::exception& e) {
- esyslog("UPnP\tException occurred while removing old object in '%s' from database '%s': %s",
+ esyslog("UPnP\tException occurred while getting objects from '%s' from database '%s': %s",
tools::GenerateUUIDFromURL(uri).c_str(), databaseFile.c_str(), e.what());
return false;
}
+ if(intersection.size() > 0){
+ ss.str(string());
+ ss << "DELETE FROM " << db::Metadata << " WHERE "
+ << " `" << property::object::KEY_PARENTID << "`"
+ << " = '" << tools::GenerateUUIDFromURL(uri) << "'";
+
+ for(StringList::iterator it = intersection.begin(); it != intersection.end(); ++it){
+ ss << " AND"
+ << " `" << property::object::KEY_OBJECTID << "`"
+ << " == '" << *it << "'";
+ }
+
+ try {
+ tntdb::Statement objects = connection.prepare(ss.str());
+ objects.execute();
+ } catch (const std::exception& e) {
+ esyslog("UPnP\tException occurred while removing old object in '%s' from database '%s': %s",
+ tools::GenerateUUIDFromURL(uri).c_str(), databaseFile.c_str(), e.what());
+
+ return false;
+ }
+ }
+
+ stringstream uristrm;
for(StringList::iterator it = entries.begin(); it != entries.end(); ++it){
uristrm.str(string());
uristrm << uri << *it;