diff options
Diffstat (limited to 'media/mediaManager.cpp')
-rw-r--r-- | media/mediaManager.cpp | 88 |
1 files changed, 55 insertions, 33 deletions
diff --git a/media/mediaManager.cpp b/media/mediaManager.cpp index 08a029c..820c0c2 100644 --- a/media/mediaManager.cpp +++ b/media/mediaManager.cpp @@ -524,10 +524,9 @@ bool cMediaManager::Initialise(){ ss << "CREATE TABLE " << db::Resources << "(" - << " resourceID INTEGER PRIMARY KEY," - << " `" << property::object::KEY_OBJECTID << "` TEXT " - << " REFERENCES metadata (`"<< property::object::KEY_OBJECTID <<"`) ON DELETE CASCADE ON UPDATE CASCADE," - << "`" << property::resource::KEY_RESOURCE << "` TEXT NOT NULL," + << "`" << property::object::KEY_OBJECTID << "` TEXT " + << "REFERENCES metadata (`"<< property::object::KEY_OBJECTID <<"`) ON DELETE CASCADE ON UPDATE CASCADE," + << "`" << property::resource::KEY_RESOURCE << "` TEXT," << "`" << property::resource::KEY_PROTOCOL_INFO << "` TEXT NOT NULL," << "`" << property::resource::KEY_SIZE << "` INTEGER," << "`" << property::resource::KEY_DURATION << "` TEXT," @@ -536,7 +535,11 @@ bool cMediaManager::Initialise(){ << "`" << property::resource::KEY_SAMPLE_FREQUENCY << "` INTEGER," << "`" << property::resource::KEY_BITS_PER_SAMPLE << "` INTEGER," << "`" << property::resource::KEY_NR_AUDIO_CHANNELS << "` INTEGER," - << "`" << property::resource::KEY_COLOR_DEPTH << "` INTEGER" + << "`" << property::resource::KEY_COLOR_DEPTH << "` INTEGER," + << "PRIMARY KEY (" + << "`" << property::object::KEY_OBJECTID << "`," + << "`" << property::resource::KEY_RESOURCE << "`" + << ")" << ")"; tntdb::Statement resourcesTable = connection.prepare(ss.str()); @@ -706,11 +709,7 @@ cUPnPResourceProvider* cMediaManager::CreateResourceProvider(const string& uri){ void cMediaManager::SetDatabaseFile(const string& file){ if(file.empty()) -#if APIVERSNUM > 10729 - databaseFile = string(cPlugin::ResourceDirectory(PLUGIN_NAME_I18N)) + "/metadata.db"; -#else databaseFile = string(cPlugin::ConfigDirectory(PLUGIN_NAME_I18N)) + "/metadata.db"; -#endif else databaseFile = file; } @@ -899,39 +898,59 @@ bool cMediaManager::RefreshObject(cMetadata& metadata){ stringstream resourcestr; - resourcestr << "DELETE FROM " << db::Resources << " WHERE " - << "`" << property::object::KEY_OBJECTID << "`" - << " = :objectID"; - - tntdb::Statement resourcestmt = connection.prepare(resourcestr.str()); - - resourcestmt.setString("objectID", objectID) - .execute(); - - resourcestr.str(string()); - - resourcestr << "INSERT INTO " << db::Resources << " (" + resourcestr << "INSERT OR IGNORE INTO " << db::Resources << " (" << "`" << property::object::KEY_OBJECTID << "`, " << "`" << property::resource::KEY_RESOURCE << "`," - << "`" << property::resource::KEY_PROTOCOL_INFO << "`," - << "`" << property::resource::KEY_SIZE << "`," - << "`" << property::resource::KEY_DURATION << "`," - << "`" << property::resource::KEY_RESOLUTION << "`," - << "`" << property::resource::KEY_BITRATE << "`," - << "`" << property::resource::KEY_SAMPLE_FREQUENCY << "`," - << "`" << property::resource::KEY_BITS_PER_SAMPLE << "`," - << "`" << property::resource::KEY_NR_AUDIO_CHANNELS << "`," - << "`" << property::resource::KEY_COLOR_DEPTH << "`" + << "`" << property::resource::KEY_PROTOCOL_INFO << "`" << ") VALUES ( " - << ":objectID, :resource, :protocolInfo, :size," - << ":duration, :resolution, :bitrate, :sampleFreq, :bpSample," - << ":nrChannels, :colorDepth" + << ":objectID, :resource, :protocolInfo" << ")"; + tntdb::Statement resourcestmt1 = connection.prepare(resourcestr.str()); + + resourcestr.str(string()); + + resourcestr << "UPDATE " << db::Resources << " SET " + << "`" << property::object::KEY_OBJECTID << "` = :objectID, " + << "`" << property::resource::KEY_RESOURCE << "` = :resource," + << "`" << property::resource::KEY_PROTOCOL_INFO << "` = :protocolInfo," + << "`" << property::resource::KEY_SIZE << "` = :size," + << "`" << property::resource::KEY_DURATION << "` = :duration," + << "`" << property::resource::KEY_RESOLUTION << "` = :resolution," + << "`" << property::resource::KEY_BITRATE << "` = :bitrate," + << "`" << property::resource::KEY_SAMPLE_FREQUENCY << "` = :sampleFreq," + << "`" << property::resource::KEY_BITS_PER_SAMPLE << "` = :bpSample," + << "`" << property::resource::KEY_NR_AUDIO_CHANNELS << "` = :nrChannels," + << "`" << property::resource::KEY_COLOR_DEPTH << "` = :colorDepth" + << " WHERE " + << "`" << property::object::KEY_OBJECTID << "` = :objectID" + << " AND " + << "`" << property::resource::KEY_RESOURCE << "` = :resource" + << ";"; + tntdb::Statement resourcestmt2 = connection.prepare(resourcestr.str()); + resourcestr.str(string()); + + resourcestr << "DELETE FROM " << db::Resources << " WHERE " + << "`" << property::object::KEY_OBJECTID << "`" + << " = '" << objectID << "'"; + cMetadata::ResourceList resources = metadata.GetResources(); for(cMetadata::ResourceList::iterator it = resources.begin(); it != resources.end(); ++it){ + + // This is appended to the delete statement and will delete all resources, which are not in the set. + // The resources are identified by their resource URI. Therefore: two resources with same URI refer + // to the same file or stream. + resourcestr << " AND" + << " `" << property::resource::KEY_RESOURCE << "`" + << " != \"" << (*it).GetResourceUri() << "\""; + + resourcestmt1.setString("objectID", objectID) + .setString("resource", (*it).GetResourceUri()) + .setString("protocolInfo", (*it).GetProtocolInfo()) + .execute(); + resourcestmt2.setString("objectID", objectID) .setString("resource", (*it).GetResourceUri()) .setString("protocolInfo", (*it).GetProtocolInfo()); @@ -971,6 +990,9 @@ bool cMediaManager::RefreshObject(cMetadata& metadata){ resourcestmt2.execute(); } + tntdb::Statement delresourcestmt = connection.prepare(resourcestr.str()); + delresourcestmt.execute(); + stringstream detailstr; detailstr << "DELETE FROM " << db::Details << " WHERE " |