diff --git a/TODO b/TODO index ac796edc..198f8303 100644 --- a/TODO +++ b/TODO @@ -21,6 +21,8 @@ - TrackView : Reselect the current playing song when displaying the updated search results - ReleaseView: display the release's publication year - OGG metadata -> properly handle metadata nested in the audio stream +- TrackView : when udating the view, reselect the current playing track +- Filters: use directly the id as constraint, instead of the name? [Video] - View the Videos in a WtTableView ? diff --git a/database/AudioTypes.hpp b/database/AudioTypes.hpp index 7847878e..12df571d 100644 --- a/database/AudioTypes.hpp +++ b/database/AudioTypes.hpp @@ -21,7 +21,7 @@ class Artist typedef Wt::Dbo::ptr pointer; typedef Wt::Dbo::dbo_traits::IdType id_type; - + Artist() {} Artist(const std::string& p_name); @@ -59,6 +59,7 @@ class Release public: typedef Wt::Dbo::ptr pointer; + typedef Wt::Dbo::dbo_traits::IdType id_type; Release() {} Release(const std::string& name); @@ -67,13 +68,15 @@ class Release static pointer getByName(Wt::Dbo::Session& session, const std::string& name); static pointer getNone(Wt::Dbo::Session& session); - static Wt::Dbo::collection getAll(Wt::Dbo::Session& session, Artist::id_type id, int offset = -1, int size = -1); + static Wt::Dbo::collection getAll(Wt::Dbo::Session& session, std::vector artistIds, int offset = -1, int size = -1); // Create static pointer create(Wt::Dbo::Session& session, const std::string& name); - std::string getName() const; + std::string getName() const { return _name; } bool isNone(void) const; + Wt::Dbo::collection > getTracks(void) const { return _tracks;} + boost::posix_time::time_duration getDuration(void) const; template void persist(Action& a) @@ -95,6 +98,7 @@ class Genre public: typedef Wt::Dbo::ptr pointer; + typedef Wt::Dbo::dbo_traits::IdType id_type; Genre(); Genre(const std::string& name); @@ -129,6 +133,7 @@ class Track public: typedef Wt::Dbo::ptr pointer; + typedef Wt::Dbo::dbo_traits::IdType id_type; Track() {} Track(const boost::filesystem::path& p, Artist::pointer artist, Release::pointer release); @@ -136,6 +141,11 @@ class Track // Find utilities static pointer getByPath(Wt::Dbo::Session& session, const boost::filesystem::path& p); static Wt::Dbo::collection< pointer > getAll(Wt::Dbo::Session& session); + static Wt::Dbo::collection< pointer > getAll(Wt::Dbo::Session& session, + const std::vector& artistIds, + const std::vector& releaseIds, + const std::vector& genreIds, + int offset = -1, int size = -1); // Create utility static pointer create(Wt::Dbo::Session& session, const boost::filesystem::path& p, Artist::pointer artist, Release::pointer release); @@ -153,15 +163,19 @@ class Track void setArtist(Artist::pointer artist) { _artist = artist; } void setRelease(Release::pointer release) { _release = release; } - std::string getName(void) const { return _name; } - const std::string& getPath(void) const { return _filePath; } - boost::posix_time::time_duration getDuration(void) const { return _duration; } - boost::posix_time::ptime getLastWriteTime(void) const { return _fileLastWrite; } - const std::vector& getChecksum(void) const { return _fileChecksum; } - Artist::pointer getArtist(void) const { return _artist; } - Release::pointer getRelease(void) const { return _release; } - bool hasGenre(Genre::pointer genre) const { return _genres.count(genre); } - std::vector< Genre::pointer > getGenres(void) const; + int getTrackNumber(void) const { return _trackNumber; } + int getDiscNumber(void) const { return _discNumber; } + std::string getName(void) const { return _name; } + const std::string& getPath(void) const { return _filePath; } + boost::posix_time::time_duration getDuration(void) const { return _duration; } + boost::posix_time::ptime getCreationTime(void) const { return _creationTime; } + Artist::pointer getArtist(void) const { return _artist; } + Release::pointer getRelease(void) const { return _release; } + bool hasGenre(Genre::pointer genre) const { return _genres.count(genre); } + std::vector< Genre::pointer > getGenres(void) const; + + boost::posix_time::ptime getLastWriteTime(void) const { return _fileLastWrite; } + const std::vector& getChecksum(void) const { return _fileChecksum; } template void persist(Action& a) diff --git a/database/Release.cpp b/database/Release.cpp index 0e736702..b73e10c4 100644 --- a/database/Release.cpp +++ b/database/Release.cpp @@ -1,5 +1,10 @@ +#include + +#include "SqlQuery.hpp" + #include "AudioTypes.hpp" + Release::Release(const std::string& name) : _name(name) { @@ -28,8 +33,36 @@ Release::create(Wt::Dbo::Session& session, const std::string& name) } Wt::Dbo::collection -Release::getAll(Wt::Dbo::Session& session, Artist::id_type id, int offset, int size) +Release::getAll(Wt::Dbo::Session& session, std::vector artistIds, int offset, int size) { - return session.query("select * from Release INNER JOIN Release.id = Artist.id").where("artist.id = ?").bind(id); + std::string sqlQuery = "SELECT r FROM release r"; + + if (!artistIds.empty()) + { + sqlQuery += " INNER JOIN artist a ON a.id = t.artist_id"; + sqlQuery += " INNER JOIN track t ON t.release_id = r.id"; + } + + Wt::Dbo::Query query = session.query( sqlQuery ).offset(offset).limit(size); + + BOOST_FOREACH(const Artist::id_type artistId, artistIds) + query.where("a.id = ?").bind(artistId); + + query.groupBy("r"); + + return query; +} + +boost::posix_time::time_duration +Release::getDuration(void) const +{ + typedef Wt::Dbo::collection< Wt::Dbo::ptr > Tracks; + + boost::posix_time::time_duration res; + + for (Tracks::const_iterator it = _tracks.begin(); it != _tracks.end(); ++it) + res += (*it)->getDuration(); + + return res; } diff --git a/database/SqlQuery.cpp b/database/SqlQuery.cpp index ab99aff3..5ab6141f 100644 --- a/database/SqlQuery.cpp +++ b/database/SqlQuery.cpp @@ -59,24 +59,54 @@ WhereClause::bind(const std::string& bindArg) return *this; } - -SelectStatement& -SelectStatement::And(const SelectStatement& statement) +InnerJoinClause::InnerJoinClause(const std::string& clause) +:_clause(clause) { - if( _statement.empty() && !statement._statement.empty()) - _statement = "SELECT "; - else if (!_statement.empty() && !statement._statement.empty()) - _statement += ","; +} + +InnerJoinClause& +InnerJoinClause::And(const InnerJoinClause& clause) +{ + if (!_clause.empty()) + _clause += " "; + + _clause += clause._clause; - _statement += statement._statement; return *this; } -FromClause::FromClause(const std::string& clause) +SelectStatement::SelectStatement(const std::string& statement) { - _clause.push_back(clause); + And(statement); } +SelectStatement& +SelectStatement::And(const std::string& statement) +{ + _statement.push_back(statement); + + _statement.sort(); + _statement.unique(); + + return *this; +} + +std::string +SelectStatement::get() const +{ + std::string res = "SELECT "; + + for (std::list::const_iterator it = _statement.begin(); it != _statement.end(); ++it) + { + if (it != _statement.begin()) + res += ","; + res += *it; + } + + return res; +} + + GroupByStatement& GroupByStatement::And(const GroupByStatement& statement) @@ -90,6 +120,10 @@ GroupByStatement::And(const GroupByStatement& statement) return *this; } +FromClause::FromClause(const std::string& clause) +{ + _clause.push_back(clause); +} FromClause& FromClause::And(const FromClause& clause) @@ -133,6 +167,9 @@ SqlQuery::get(void) const if (!_fromClause.get().empty()) oss << " " << _fromClause.get(); + if (!_innerJoinClause.get().empty()) + oss << " " << _innerJoinClause.get(); + if (!_whereClause.get().empty()) oss << " " << _whereClause.get(); diff --git a/database/SqlQuery.hpp b/database/SqlQuery.hpp index 9f8734b7..6346f910 100644 --- a/database/SqlQuery.hpp +++ b/database/SqlQuery.hpp @@ -28,6 +28,21 @@ class WhereClause }; +class InnerJoinClause +{ + public: + + InnerJoinClause() {} + InnerJoinClause(const std::string& clause); + + InnerJoinClause& And(const InnerJoinClause& clause); + std::string get() const { return _clause;} + + private: + + std::string _clause; +}; + class GroupByStatement { public: @@ -46,16 +61,16 @@ class GroupByStatement class SelectStatement { public: - SelectStatement() {} - SelectStatement(const std::string& statement) { _statement = statement; } + SelectStatement() {}; + SelectStatement(const std::string& item); - SelectStatement& And(const SelectStatement& statement); + SelectStatement& And(const std::string& item); - std::string get() const {return _statement;} + std::string get() const; private: - std::string _statement; // SELECT statement + std::list _statement; }; class FromClause @@ -80,7 +95,10 @@ class SqlQuery public: SelectStatement& select(void) { return _selectStatement;} + SelectStatement& select(const std::string& statement) { _selectStatement = SelectStatement(statement); return _selectStatement; } FromClause& from(void) { return _fromClause; } + FromClause& from(const std::string& clause) { _whereClause = WhereClause(clause); return _fromClause; } + InnerJoinClause& innerJoin(void) { return _innerJoinClause; } WhereClause& where(void) { return _whereClause; } const WhereClause& where(void) const { return _whereClause; } GroupByStatement& groupBy(void) { return _groupByStatement; } @@ -91,6 +109,7 @@ class SqlQuery private: SelectStatement _selectStatement; // SELECT statement + InnerJoinClause _innerJoinClause; // INNER JOIN FromClause _fromClause; // FROM tables WhereClause _whereClause; // WHERE clause GroupByStatement _groupByStatement; // GROUP BY statement diff --git a/database/Track.cpp b/database/Track.cpp index 90ab4f73..4e3aaf1c 100644 --- a/database/Track.cpp +++ b/database/Track.cpp @@ -1,5 +1,7 @@ #include +#include "SqlQuery.hpp" + #include "AudioTypes.hpp" @@ -53,3 +55,75 @@ Track::getGenres(void) const std::copy(_genres.begin(), _genres.end(), std::back_inserter(genres)); return genres; } + +Wt::Dbo::collection< Track::pointer > +Track::getAll(Wt::Dbo::Session& session, + const std::vector& artistIds, + const std::vector& releaseIds, + const std::vector& genreIds, + int offset, int size) +{ + std::string sqlQuery = "SELECT t FROM track t"; + + if (!artistIds.empty()) + sqlQuery += " INNER JOIN artist a ON a.id = t.artist_id"; + + if (!releaseIds.empty()) + sqlQuery += " INNER JOIN release r ON r.id = t.release_id"; + + if (!genreIds.empty()) + { + sqlQuery += " INNER JOIN genre g ON g.id = t_g.genre_id"; + sqlQuery += " INNER JOIN track_genre t_g ON t_g.track_id = t.id AND t_d.genre_id = g.id"; + } + + WhereClause where; + + { + WhereClause artistWhere; + + for (std::size_t i = 0; i < artistIds.size(); ++i) + artistWhere.Or( WhereClause("a.id = ?") ); + + where.And(artistWhere); + } + + { + WhereClause releaseWhere; + + for (std::size_t i = 0; i < releaseIds.size(); ++i) + releaseWhere.Or( WhereClause("r.id = ?") ); + + where.And(releaseWhere); + } + + { + WhereClause genreWhere; + + for (std::size_t i = 0; i < genreIds.size(); ++i) + genreWhere.Or( WhereClause("g.id = ?") ); + + where.And(genreWhere); + } + + + Wt::Dbo::Query query = session.query( sqlQuery + " " + where.get() ).offset(offset).limit(size); + + BOOST_FOREACH(const Artist::id_type artistId, artistIds) + query.bind(artistId); + + BOOST_FOREACH(const Release::id_type releaseId, releaseIds) + query.bind(releaseId); + + BOOST_FOREACH(const Genre::id_type genreId, genreIds) + query.bind(genreId); + + query.groupBy("t"); + + return query; +} + + + + + diff --git a/remote/messages/collection.pb.cc b/remote/messages/collection.pb.cc index ede25798..3ccd111a 100644 --- a/remote/messages/collection.pb.cc +++ b/remote/messages/collection.pb.cc @@ -336,15 +336,15 @@ void protobuf_AssignDesc_collection_2eproto() { AudioCollectionResponse_Track_descriptor_ = AudioCollectionResponse_descriptor_->nested_type(8); static const int AudioCollectionResponse_Track_offsets_[11] = { GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(AudioCollectionResponse_Track, id_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(AudioCollectionResponse_Track, artist_id_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(AudioCollectionResponse_Track, release_id_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(AudioCollectionResponse_Track, genre_id_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(AudioCollectionResponse_Track, disc_number_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(AudioCollectionResponse_Track, track_number_), - GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(AudioCollectionResponse_Track, artist_), - GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(AudioCollectionResponse_Track, release_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(AudioCollectionResponse_Track, name_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(AudioCollectionResponse_Track, duration_secs_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(AudioCollectionResponse_Track, release_date_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(AudioCollectionResponse_Track, original_release_date_), - GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(AudioCollectionResponse_Track, genres_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(AudioCollectionResponse_Track, coverart_), }; AudioCollectionResponse_Track_reflection_ = @@ -476,7 +476,7 @@ void protobuf_AddDesc_collection_2eproto() { "nRequest.BatchParameter\"a\n\004Type\022\024\n\020TypeG" "etGenreList\020\001\022\025\n\021TypeGetArtistList\020\002\022\026\n\022" "TypeGetReleaseList\020\003\022\024\n\020TypeGetTrackList" - "\020\004\"\365\t\n\027AudioCollectionResponse\0222\n\004type\030\001" + "\020\004\"\375\t\n\027AudioCollectionResponse\0222\n\004type\030\001" " \001(\0162$.Remote.AudioCollectionResponse.Ty" "pe\022\034\n\005error\030\002 \001(\0132\r.Remote.Error\022=\n\ngenr" "e_list\030\003 \001(\0132).Remote.AudioCollectionRes" @@ -499,15 +499,16 @@ void protobuf_AddDesc_collection_2eproto() { "\022\n\n\002id\030\001 \002(\004\022\014\n\004name\030\002 \002(\t\022\021\n\tnb_tracks\030" "\003 \002(\r\022\025\n\rduration_secs\030\004 \002(\r\022\024\n\014release_" "date\030\005 \001(\t\022:\n\010coverArt\030\006 \001(\0132(.Remote.Au" - "dioCollectionResponse.CoverArt\032\333\001\n\005Track" - "\022\n\n\002id\030\001 \002(\004\022\023\n\013disc_number\030\002 \001(\r\022\024\n\014tra" - "ck_number\030\003 \001(\r\022\016\n\006artist\030\004 \001(\t\022\017\n\007relea" - "se\030\005 \001(\t\022\014\n\004name\030\006 \002(\t\022\025\n\rduration_secs\030" - "\007 \002(\r\022\024\n\014release_date\030\010 \001(\t\022\035\n\025original_" - "release_date\030\t \001(\t\022\016\n\006genres\030\n \003(\t\022\020\n\010co" - "verArt\030\013 \001(\014\"d\n\004Type\022\r\n\tTypeError\020\001\022\021\n\rT" - "ypeGenreList\020\002\022\022\n\016TypeArtistList\020\003\022\023\n\017Ty" - "peReleaseList\020\004\022\021\n\rTypeTrackList\020\005", 2314); + "dioCollectionResponse.CoverArt\032\343\001\n\005Track" + "\022\n\n\002id\030\001 \002(\004\022\021\n\tartist_id\030\002 \002(\004\022\022\n\nrelea" + "se_id\030\003 \002(\004\022\020\n\010genre_id\030\004 \003(\004\022\023\n\013disc_nu" + "mber\030\005 \001(\r\022\024\n\014track_number\030\006 \001(\r\022\014\n\004name" + "\030\007 \002(\t\022\025\n\rduration_secs\030\010 \002(\r\022\024\n\014release" + "_date\030\t \001(\t\022\035\n\025original_release_date\030\n \001" + "(\t\022\020\n\010coverArt\030\013 \001(\014\"d\n\004Type\022\r\n\tTypeErro" + "r\020\001\022\021\n\rTypeGenreList\020\002\022\022\n\016TypeArtistList" + "\020\003\022\023\n\017TypeReleaseList\020\004\022\021\n\rTypeTrackList" + "\020\005", 2322); ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile( "collection.proto", &protobuf_RegisterTypes); AudioCollectionRequest::default_instance_ = new AudioCollectionRequest(); @@ -4606,15 +4607,15 @@ void AudioCollectionResponse_Release::Swap(AudioCollectionResponse_Release* othe #ifndef _MSC_VER const int AudioCollectionResponse_Track::kIdFieldNumber; +const int AudioCollectionResponse_Track::kArtistIdFieldNumber; +const int AudioCollectionResponse_Track::kReleaseIdFieldNumber; +const int AudioCollectionResponse_Track::kGenreIdFieldNumber; const int AudioCollectionResponse_Track::kDiscNumberFieldNumber; const int AudioCollectionResponse_Track::kTrackNumberFieldNumber; -const int AudioCollectionResponse_Track::kArtistFieldNumber; -const int AudioCollectionResponse_Track::kReleaseFieldNumber; const int AudioCollectionResponse_Track::kNameFieldNumber; const int AudioCollectionResponse_Track::kDurationSecsFieldNumber; const int AudioCollectionResponse_Track::kReleaseDateFieldNumber; const int AudioCollectionResponse_Track::kOriginalReleaseDateFieldNumber; -const int AudioCollectionResponse_Track::kGenresFieldNumber; const int AudioCollectionResponse_Track::kCoverArtFieldNumber; #endif // !_MSC_VER @@ -4635,10 +4636,10 @@ AudioCollectionResponse_Track::AudioCollectionResponse_Track(const AudioCollecti void AudioCollectionResponse_Track::SharedCtor() { _cached_size_ = 0; id_ = GOOGLE_ULONGLONG(0); + artist_id_ = GOOGLE_ULONGLONG(0); + release_id_ = GOOGLE_ULONGLONG(0); disc_number_ = 0u; track_number_ = 0u; - artist_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); - release_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); duration_secs_ = 0u; release_date_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); @@ -4652,12 +4653,6 @@ AudioCollectionResponse_Track::~AudioCollectionResponse_Track() { } void AudioCollectionResponse_Track::SharedDtor() { - if (artist_ != &::google::protobuf::internal::kEmptyString) { - delete artist_; - } - if (release_ != &::google::protobuf::internal::kEmptyString) { - delete release_; - } if (name_ != &::google::protobuf::internal::kEmptyString) { delete name_; } @@ -4698,31 +4693,23 @@ AudioCollectionResponse_Track* AudioCollectionResponse_Track::New() const { void AudioCollectionResponse_Track::Clear() { if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { id_ = GOOGLE_ULONGLONG(0); + artist_id_ = GOOGLE_ULONGLONG(0); + release_id_ = GOOGLE_ULONGLONG(0); disc_number_ = 0u; track_number_ = 0u; - if (has_artist()) { - if (artist_ != &::google::protobuf::internal::kEmptyString) { - artist_->clear(); - } - } - if (has_release()) { - if (release_ != &::google::protobuf::internal::kEmptyString) { - release_->clear(); - } - } if (has_name()) { if (name_ != &::google::protobuf::internal::kEmptyString) { name_->clear(); } } duration_secs_ = 0u; + } + if (_has_bits_[8 / 32] & (0xffu << (8 % 32))) { if (has_release_date()) { if (release_date_ != &::google::protobuf::internal::kEmptyString) { release_date_->clear(); } } - } - if (_has_bits_[8 / 32] & (0xffu << (8 % 32))) { if (has_original_release_date()) { if (original_release_date_ != &::google::protobuf::internal::kEmptyString) { original_release_date_->clear(); @@ -4734,7 +4721,7 @@ void AudioCollectionResponse_Track::Clear() { } } } - genres_.Clear(); + genre_id_.Clear(); ::memset(_has_bits_, 0, sizeof(_has_bits_)); mutable_unknown_fields()->Clear(); } @@ -4756,12 +4743,66 @@ bool AudioCollectionResponse_Track::MergePartialFromCodedStream( } else { goto handle_uninterpreted; } - if (input->ExpectTag(16)) goto parse_disc_number; + if (input->ExpectTag(16)) goto parse_artist_id; break; } - // optional uint32 disc_number = 2; + // required uint64 artist_id = 2; case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_artist_id: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>( + input, &artist_id_))); + set_has_artist_id(); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(24)) goto parse_release_id; + break; + } + + // required uint64 release_id = 3; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_release_id: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>( + input, &release_id_))); + set_has_release_id(); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(32)) goto parse_genre_id; + break; + } + + // repeated uint64 genre_id = 4; + case 4: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_genre_id: + DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitive< + ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>( + 1, 32, input, this->mutable_genre_id()))); + } else if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) + == ::google::protobuf::internal::WireFormatLite:: + WIRETYPE_LENGTH_DELIMITED) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitiveNoInline< + ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>( + input, this->mutable_genre_id()))); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(32)) goto parse_genre_id; + if (input->ExpectTag(40)) goto parse_disc_number; + break; + } + + // optional uint32 disc_number = 5; + case 5: { if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { parse_disc_number: @@ -4772,12 +4813,12 @@ bool AudioCollectionResponse_Track::MergePartialFromCodedStream( } else { goto handle_uninterpreted; } - if (input->ExpectTag(24)) goto parse_track_number; + if (input->ExpectTag(48)) goto parse_track_number; break; } - // optional uint32 track_number = 3; - case 3: { + // optional uint32 track_number = 6; + case 6: { if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { parse_track_number: @@ -4788,46 +4829,12 @@ bool AudioCollectionResponse_Track::MergePartialFromCodedStream( } else { goto handle_uninterpreted; } - if (input->ExpectTag(34)) goto parse_artist; + if (input->ExpectTag(58)) goto parse_name; break; } - // optional string artist = 4; - case 4: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - parse_artist: - DO_(::google::protobuf::internal::WireFormatLite::ReadString( - input, this->mutable_artist())); - ::google::protobuf::internal::WireFormat::VerifyUTF8String( - this->artist().data(), this->artist().length(), - ::google::protobuf::internal::WireFormat::PARSE); - } else { - goto handle_uninterpreted; - } - if (input->ExpectTag(42)) goto parse_release; - break; - } - - // optional string release = 5; - case 5: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - parse_release: - DO_(::google::protobuf::internal::WireFormatLite::ReadString( - input, this->mutable_release())); - ::google::protobuf::internal::WireFormat::VerifyUTF8String( - this->release().data(), this->release().length(), - ::google::protobuf::internal::WireFormat::PARSE); - } else { - goto handle_uninterpreted; - } - if (input->ExpectTag(50)) goto parse_name; - break; - } - - // required string name = 6; - case 6: { + // required string name = 7; + case 7: { if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { parse_name: @@ -4839,12 +4846,12 @@ bool AudioCollectionResponse_Track::MergePartialFromCodedStream( } else { goto handle_uninterpreted; } - if (input->ExpectTag(56)) goto parse_duration_secs; + if (input->ExpectTag(64)) goto parse_duration_secs; break; } - // required uint32 duration_secs = 7; - case 7: { + // required uint32 duration_secs = 8; + case 8: { if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { parse_duration_secs: @@ -4855,12 +4862,12 @@ bool AudioCollectionResponse_Track::MergePartialFromCodedStream( } else { goto handle_uninterpreted; } - if (input->ExpectTag(66)) goto parse_release_date; + if (input->ExpectTag(74)) goto parse_release_date; break; } - // optional string release_date = 8; - case 8: { + // optional string release_date = 9; + case 9: { if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { parse_release_date: @@ -4872,12 +4879,12 @@ bool AudioCollectionResponse_Track::MergePartialFromCodedStream( } else { goto handle_uninterpreted; } - if (input->ExpectTag(74)) goto parse_original_release_date; + if (input->ExpectTag(82)) goto parse_original_release_date; break; } - // optional string original_release_date = 9; - case 9: { + // optional string original_release_date = 10; + case 10: { if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { parse_original_release_date: @@ -4889,25 +4896,6 @@ bool AudioCollectionResponse_Track::MergePartialFromCodedStream( } else { goto handle_uninterpreted; } - if (input->ExpectTag(82)) goto parse_genres; - break; - } - - // repeated string genres = 10; - case 10: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - parse_genres: - DO_(::google::protobuf::internal::WireFormatLite::ReadString( - input, this->add_genres())); - ::google::protobuf::internal::WireFormat::VerifyUTF8String( - this->genres(this->genres_size() - 1).data(), - this->genres(this->genres_size() - 1).length(), - ::google::protobuf::internal::WireFormat::PARSE); - } else { - goto handle_uninterpreted; - } - if (input->ExpectTag(82)) goto parse_genres; if (input->ExpectTag(90)) goto parse_coverArt; break; } @@ -4949,73 +4937,62 @@ void AudioCollectionResponse_Track::SerializeWithCachedSizes( ::google::protobuf::internal::WireFormatLite::WriteUInt64(1, this->id(), output); } - // optional uint32 disc_number = 2; + // required uint64 artist_id = 2; + if (has_artist_id()) { + ::google::protobuf::internal::WireFormatLite::WriteUInt64(2, this->artist_id(), output); + } + + // required uint64 release_id = 3; + if (has_release_id()) { + ::google::protobuf::internal::WireFormatLite::WriteUInt64(3, this->release_id(), output); + } + + // repeated uint64 genre_id = 4; + for (int i = 0; i < this->genre_id_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteUInt64( + 4, this->genre_id(i), output); + } + + // optional uint32 disc_number = 5; if (has_disc_number()) { - ::google::protobuf::internal::WireFormatLite::WriteUInt32(2, this->disc_number(), output); + ::google::protobuf::internal::WireFormatLite::WriteUInt32(5, this->disc_number(), output); } - // optional uint32 track_number = 3; + // optional uint32 track_number = 6; if (has_track_number()) { - ::google::protobuf::internal::WireFormatLite::WriteUInt32(3, this->track_number(), output); + ::google::protobuf::internal::WireFormatLite::WriteUInt32(6, this->track_number(), output); } - // optional string artist = 4; - if (has_artist()) { - ::google::protobuf::internal::WireFormat::VerifyUTF8String( - this->artist().data(), this->artist().length(), - ::google::protobuf::internal::WireFormat::SERIALIZE); - ::google::protobuf::internal::WireFormatLite::WriteString( - 4, this->artist(), output); - } - - // optional string release = 5; - if (has_release()) { - ::google::protobuf::internal::WireFormat::VerifyUTF8String( - this->release().data(), this->release().length(), - ::google::protobuf::internal::WireFormat::SERIALIZE); - ::google::protobuf::internal::WireFormatLite::WriteString( - 5, this->release(), output); - } - - // required string name = 6; + // required string name = 7; if (has_name()) { ::google::protobuf::internal::WireFormat::VerifyUTF8String( this->name().data(), this->name().length(), ::google::protobuf::internal::WireFormat::SERIALIZE); ::google::protobuf::internal::WireFormatLite::WriteString( - 6, this->name(), output); + 7, this->name(), output); } - // required uint32 duration_secs = 7; + // required uint32 duration_secs = 8; if (has_duration_secs()) { - ::google::protobuf::internal::WireFormatLite::WriteUInt32(7, this->duration_secs(), output); + ::google::protobuf::internal::WireFormatLite::WriteUInt32(8, this->duration_secs(), output); } - // optional string release_date = 8; + // optional string release_date = 9; if (has_release_date()) { ::google::protobuf::internal::WireFormat::VerifyUTF8String( this->release_date().data(), this->release_date().length(), ::google::protobuf::internal::WireFormat::SERIALIZE); ::google::protobuf::internal::WireFormatLite::WriteString( - 8, this->release_date(), output); + 9, this->release_date(), output); } - // optional string original_release_date = 9; + // optional string original_release_date = 10; if (has_original_release_date()) { ::google::protobuf::internal::WireFormat::VerifyUTF8String( this->original_release_date().data(), this->original_release_date().length(), ::google::protobuf::internal::WireFormat::SERIALIZE); ::google::protobuf::internal::WireFormatLite::WriteString( - 9, this->original_release_date(), output); - } - - // repeated string genres = 10; - for (int i = 0; i < this->genres_size(); i++) { - ::google::protobuf::internal::WireFormat::VerifyUTF8String( - this->genres(i).data(), this->genres(i).length(), - ::google::protobuf::internal::WireFormat::SERIALIZE); - ::google::protobuf::internal::WireFormatLite::WriteString( - 10, this->genres(i), output); + 10, this->original_release_date(), output); } // optional bytes coverArt = 11; @@ -5037,78 +5014,65 @@ void AudioCollectionResponse_Track::SerializeWithCachedSizes( target = ::google::protobuf::internal::WireFormatLite::WriteUInt64ToArray(1, this->id(), target); } - // optional uint32 disc_number = 2; + // required uint64 artist_id = 2; + if (has_artist_id()) { + target = ::google::protobuf::internal::WireFormatLite::WriteUInt64ToArray(2, this->artist_id(), target); + } + + // required uint64 release_id = 3; + if (has_release_id()) { + target = ::google::protobuf::internal::WireFormatLite::WriteUInt64ToArray(3, this->release_id(), target); + } + + // repeated uint64 genre_id = 4; + for (int i = 0; i < this->genre_id_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteUInt64ToArray(4, this->genre_id(i), target); + } + + // optional uint32 disc_number = 5; if (has_disc_number()) { - target = ::google::protobuf::internal::WireFormatLite::WriteUInt32ToArray(2, this->disc_number(), target); + target = ::google::protobuf::internal::WireFormatLite::WriteUInt32ToArray(5, this->disc_number(), target); } - // optional uint32 track_number = 3; + // optional uint32 track_number = 6; if (has_track_number()) { - target = ::google::protobuf::internal::WireFormatLite::WriteUInt32ToArray(3, this->track_number(), target); + target = ::google::protobuf::internal::WireFormatLite::WriteUInt32ToArray(6, this->track_number(), target); } - // optional string artist = 4; - if (has_artist()) { - ::google::protobuf::internal::WireFormat::VerifyUTF8String( - this->artist().data(), this->artist().length(), - ::google::protobuf::internal::WireFormat::SERIALIZE); - target = - ::google::protobuf::internal::WireFormatLite::WriteStringToArray( - 4, this->artist(), target); - } - - // optional string release = 5; - if (has_release()) { - ::google::protobuf::internal::WireFormat::VerifyUTF8String( - this->release().data(), this->release().length(), - ::google::protobuf::internal::WireFormat::SERIALIZE); - target = - ::google::protobuf::internal::WireFormatLite::WriteStringToArray( - 5, this->release(), target); - } - - // required string name = 6; + // required string name = 7; if (has_name()) { ::google::protobuf::internal::WireFormat::VerifyUTF8String( this->name().data(), this->name().length(), ::google::protobuf::internal::WireFormat::SERIALIZE); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( - 6, this->name(), target); + 7, this->name(), target); } - // required uint32 duration_secs = 7; + // required uint32 duration_secs = 8; if (has_duration_secs()) { - target = ::google::protobuf::internal::WireFormatLite::WriteUInt32ToArray(7, this->duration_secs(), target); + target = ::google::protobuf::internal::WireFormatLite::WriteUInt32ToArray(8, this->duration_secs(), target); } - // optional string release_date = 8; + // optional string release_date = 9; if (has_release_date()) { ::google::protobuf::internal::WireFormat::VerifyUTF8String( this->release_date().data(), this->release_date().length(), ::google::protobuf::internal::WireFormat::SERIALIZE); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( - 8, this->release_date(), target); + 9, this->release_date(), target); } - // optional string original_release_date = 9; + // optional string original_release_date = 10; if (has_original_release_date()) { ::google::protobuf::internal::WireFormat::VerifyUTF8String( this->original_release_date().data(), this->original_release_date().length(), ::google::protobuf::internal::WireFormat::SERIALIZE); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( - 9, this->original_release_date(), target); - } - - // repeated string genres = 10; - for (int i = 0; i < this->genres_size(); i++) { - ::google::protobuf::internal::WireFormat::VerifyUTF8String( - this->genres(i).data(), this->genres(i).length(), - ::google::protobuf::internal::WireFormat::SERIALIZE); - target = ::google::protobuf::internal::WireFormatLite:: - WriteStringToArray(10, this->genres(i), target); + 10, this->original_release_date(), target); } // optional bytes coverArt = 11; @@ -5136,58 +5100,58 @@ int AudioCollectionResponse_Track::ByteSize() const { this->id()); } - // optional uint32 disc_number = 2; + // required uint64 artist_id = 2; + if (has_artist_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::UInt64Size( + this->artist_id()); + } + + // required uint64 release_id = 3; + if (has_release_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::UInt64Size( + this->release_id()); + } + + // optional uint32 disc_number = 5; if (has_disc_number()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::UInt32Size( this->disc_number()); } - // optional uint32 track_number = 3; + // optional uint32 track_number = 6; if (has_track_number()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::UInt32Size( this->track_number()); } - // optional string artist = 4; - if (has_artist()) { - total_size += 1 + - ::google::protobuf::internal::WireFormatLite::StringSize( - this->artist()); - } - - // optional string release = 5; - if (has_release()) { - total_size += 1 + - ::google::protobuf::internal::WireFormatLite::StringSize( - this->release()); - } - - // required string name = 6; + // required string name = 7; if (has_name()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->name()); } - // required uint32 duration_secs = 7; + // required uint32 duration_secs = 8; if (has_duration_secs()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::UInt32Size( this->duration_secs()); } - // optional string release_date = 8; + } + if (_has_bits_[8 / 32] & (0xffu << (8 % 32))) { + // optional string release_date = 9; if (has_release_date()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->release_date()); } - } - if (_has_bits_[8 / 32] & (0xffu << (8 % 32))) { - // optional string original_release_date = 9; + // optional string original_release_date = 10; if (has_original_release_date()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( @@ -5202,11 +5166,14 @@ int AudioCollectionResponse_Track::ByteSize() const { } } - // repeated string genres = 10; - total_size += 1 * this->genres_size(); - for (int i = 0; i < this->genres_size(); i++) { - total_size += ::google::protobuf::internal::WireFormatLite::StringSize( - this->genres(i)); + // repeated uint64 genre_id = 4; + { + int data_size = 0; + for (int i = 0; i < this->genre_id_size(); i++) { + data_size += ::google::protobuf::internal::WireFormatLite:: + UInt64Size(this->genre_id(i)); + } + total_size += 1 * this->genre_id_size() + data_size; } if (!unknown_fields().empty()) { @@ -5234,34 +5201,34 @@ void AudioCollectionResponse_Track::MergeFrom(const ::google::protobuf::Message& void AudioCollectionResponse_Track::MergeFrom(const AudioCollectionResponse_Track& from) { GOOGLE_CHECK_NE(&from, this); - genres_.MergeFrom(from.genres_); + genre_id_.MergeFrom(from.genre_id_); if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { if (from.has_id()) { set_id(from.id()); } + if (from.has_artist_id()) { + set_artist_id(from.artist_id()); + } + if (from.has_release_id()) { + set_release_id(from.release_id()); + } if (from.has_disc_number()) { set_disc_number(from.disc_number()); } if (from.has_track_number()) { set_track_number(from.track_number()); } - if (from.has_artist()) { - set_artist(from.artist()); - } - if (from.has_release()) { - set_release(from.release()); - } if (from.has_name()) { set_name(from.name()); } if (from.has_duration_secs()) { set_duration_secs(from.duration_secs()); } + } + if (from._has_bits_[8 / 32] & (0xffu << (8 % 32))) { if (from.has_release_date()) { set_release_date(from.release_date()); } - } - if (from._has_bits_[8 / 32] & (0xffu << (8 % 32))) { if (from.has_original_release_date()) { set_original_release_date(from.original_release_date()); } @@ -5285,7 +5252,7 @@ void AudioCollectionResponse_Track::CopyFrom(const AudioCollectionResponse_Track } bool AudioCollectionResponse_Track::IsInitialized() const { - if ((_has_bits_[0] & 0x00000061) != 0x00000061) return false; + if ((_has_bits_[0] & 0x000000c7) != 0x000000c7) return false; return true; } @@ -5293,15 +5260,15 @@ bool AudioCollectionResponse_Track::IsInitialized() const { void AudioCollectionResponse_Track::Swap(AudioCollectionResponse_Track* other) { if (other != this) { std::swap(id_, other->id_); + std::swap(artist_id_, other->artist_id_); + std::swap(release_id_, other->release_id_); + genre_id_.Swap(&other->genre_id_); std::swap(disc_number_, other->disc_number_); std::swap(track_number_, other->track_number_); - std::swap(artist_, other->artist_); - std::swap(release_, other->release_); std::swap(name_, other->name_); std::swap(duration_secs_, other->duration_secs_); std::swap(release_date_, other->release_date_); std::swap(original_release_date_, other->original_release_date_); - genres_.Swap(&other->genres_); std::swap(coverart_, other->coverart_); std::swap(_has_bits_[0], other->_has_bits_[0]); _unknown_fields_.Swap(&other->_unknown_fields_); diff --git a/remote/messages/collection.pb.h b/remote/messages/collection.pb.h index b9b6b4ed..535e689d 100644 --- a/remote/messages/collection.pb.h +++ b/remote/messages/collection.pb.h @@ -1638,48 +1638,50 @@ class AudioCollectionResponse_Track : public ::google::protobuf::Message { inline ::google::protobuf::uint64 id() const; inline void set_id(::google::protobuf::uint64 value); - // optional uint32 disc_number = 2; + // required uint64 artist_id = 2; + inline bool has_artist_id() const; + inline void clear_artist_id(); + static const int kArtistIdFieldNumber = 2; + inline ::google::protobuf::uint64 artist_id() const; + inline void set_artist_id(::google::protobuf::uint64 value); + + // required uint64 release_id = 3; + inline bool has_release_id() const; + inline void clear_release_id(); + static const int kReleaseIdFieldNumber = 3; + inline ::google::protobuf::uint64 release_id() const; + inline void set_release_id(::google::protobuf::uint64 value); + + // repeated uint64 genre_id = 4; + inline int genre_id_size() const; + inline void clear_genre_id(); + static const int kGenreIdFieldNumber = 4; + inline ::google::protobuf::uint64 genre_id(int index) const; + inline void set_genre_id(int index, ::google::protobuf::uint64 value); + inline void add_genre_id(::google::protobuf::uint64 value); + inline const ::google::protobuf::RepeatedField< ::google::protobuf::uint64 >& + genre_id() const; + inline ::google::protobuf::RepeatedField< ::google::protobuf::uint64 >* + mutable_genre_id(); + + // optional uint32 disc_number = 5; inline bool has_disc_number() const; inline void clear_disc_number(); - static const int kDiscNumberFieldNumber = 2; + static const int kDiscNumberFieldNumber = 5; inline ::google::protobuf::uint32 disc_number() const; inline void set_disc_number(::google::protobuf::uint32 value); - // optional uint32 track_number = 3; + // optional uint32 track_number = 6; inline bool has_track_number() const; inline void clear_track_number(); - static const int kTrackNumberFieldNumber = 3; + static const int kTrackNumberFieldNumber = 6; inline ::google::protobuf::uint32 track_number() const; inline void set_track_number(::google::protobuf::uint32 value); - // optional string artist = 4; - inline bool has_artist() const; - inline void clear_artist(); - static const int kArtistFieldNumber = 4; - inline const ::std::string& artist() const; - inline void set_artist(const ::std::string& value); - inline void set_artist(const char* value); - inline void set_artist(const char* value, size_t size); - inline ::std::string* mutable_artist(); - inline ::std::string* release_artist(); - inline void set_allocated_artist(::std::string* artist); - - // optional string release = 5; - inline bool has_release() const; - inline void clear_release(); - static const int kReleaseFieldNumber = 5; - inline const ::std::string& release() const; - inline void set_release(const ::std::string& value); - inline void set_release(const char* value); - inline void set_release(const char* value, size_t size); - inline ::std::string* mutable_release(); - inline ::std::string* release_release(); - inline void set_allocated_release(::std::string* release); - - // required string name = 6; + // required string name = 7; inline bool has_name() const; inline void clear_name(); - static const int kNameFieldNumber = 6; + static const int kNameFieldNumber = 7; inline const ::std::string& name() const; inline void set_name(const ::std::string& value); inline void set_name(const char* value); @@ -1688,17 +1690,17 @@ class AudioCollectionResponse_Track : public ::google::protobuf::Message { inline ::std::string* release_name(); inline void set_allocated_name(::std::string* name); - // required uint32 duration_secs = 7; + // required uint32 duration_secs = 8; inline bool has_duration_secs() const; inline void clear_duration_secs(); - static const int kDurationSecsFieldNumber = 7; + static const int kDurationSecsFieldNumber = 8; inline ::google::protobuf::uint32 duration_secs() const; inline void set_duration_secs(::google::protobuf::uint32 value); - // optional string release_date = 8; + // optional string release_date = 9; inline bool has_release_date() const; inline void clear_release_date(); - static const int kReleaseDateFieldNumber = 8; + static const int kReleaseDateFieldNumber = 9; inline const ::std::string& release_date() const; inline void set_release_date(const ::std::string& value); inline void set_release_date(const char* value); @@ -1707,10 +1709,10 @@ class AudioCollectionResponse_Track : public ::google::protobuf::Message { inline ::std::string* release_release_date(); inline void set_allocated_release_date(::std::string* release_date); - // optional string original_release_date = 9; + // optional string original_release_date = 10; inline bool has_original_release_date() const; inline void clear_original_release_date(); - static const int kOriginalReleaseDateFieldNumber = 9; + static const int kOriginalReleaseDateFieldNumber = 10; inline const ::std::string& original_release_date() const; inline void set_original_release_date(const ::std::string& value); inline void set_original_release_date(const char* value); @@ -1719,22 +1721,6 @@ class AudioCollectionResponse_Track : public ::google::protobuf::Message { inline ::std::string* release_original_release_date(); inline void set_allocated_original_release_date(::std::string* original_release_date); - // repeated string genres = 10; - inline int genres_size() const; - inline void clear_genres(); - static const int kGenresFieldNumber = 10; - inline const ::std::string& genres(int index) const; - inline ::std::string* mutable_genres(int index); - inline void set_genres(int index, const ::std::string& value); - inline void set_genres(int index, const char* value); - inline void set_genres(int index, const char* value, size_t size); - inline ::std::string* add_genres(); - inline void add_genres(const ::std::string& value); - inline void add_genres(const char* value); - inline void add_genres(const char* value, size_t size); - inline const ::google::protobuf::RepeatedPtrField< ::std::string>& genres() const; - inline ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_genres(); - // optional bytes coverArt = 11; inline bool has_coverart() const; inline void clear_coverart(); @@ -1751,14 +1737,14 @@ class AudioCollectionResponse_Track : public ::google::protobuf::Message { private: inline void set_has_id(); inline void clear_has_id(); + inline void set_has_artist_id(); + inline void clear_has_artist_id(); + inline void set_has_release_id(); + inline void clear_has_release_id(); inline void set_has_disc_number(); inline void clear_has_disc_number(); inline void set_has_track_number(); inline void clear_has_track_number(); - inline void set_has_artist(); - inline void clear_has_artist(); - inline void set_has_release(); - inline void clear_has_release(); inline void set_has_name(); inline void clear_has_name(); inline void set_has_duration_secs(); @@ -1773,14 +1759,14 @@ class AudioCollectionResponse_Track : public ::google::protobuf::Message { ::google::protobuf::UnknownFieldSet _unknown_fields_; ::google::protobuf::uint64 id_; + ::google::protobuf::uint64 artist_id_; + ::google::protobuf::uint64 release_id_; + ::google::protobuf::RepeatedField< ::google::protobuf::uint64 > genre_id_; ::google::protobuf::uint32 disc_number_; ::google::protobuf::uint32 track_number_; - ::std::string* artist_; - ::std::string* release_; ::std::string* name_; ::std::string* release_date_; ::std::string* original_release_date_; - ::google::protobuf::RepeatedPtrField< ::std::string> genres_; ::std::string* coverart_; ::google::protobuf::uint32 duration_secs_; @@ -3287,16 +3273,85 @@ inline void AudioCollectionResponse_Track::set_id(::google::protobuf::uint64 val id_ = value; } -// optional uint32 disc_number = 2; -inline bool AudioCollectionResponse_Track::has_disc_number() const { +// required uint64 artist_id = 2; +inline bool AudioCollectionResponse_Track::has_artist_id() const { return (_has_bits_[0] & 0x00000002u) != 0; } -inline void AudioCollectionResponse_Track::set_has_disc_number() { +inline void AudioCollectionResponse_Track::set_has_artist_id() { _has_bits_[0] |= 0x00000002u; } -inline void AudioCollectionResponse_Track::clear_has_disc_number() { +inline void AudioCollectionResponse_Track::clear_has_artist_id() { _has_bits_[0] &= ~0x00000002u; } +inline void AudioCollectionResponse_Track::clear_artist_id() { + artist_id_ = GOOGLE_ULONGLONG(0); + clear_has_artist_id(); +} +inline ::google::protobuf::uint64 AudioCollectionResponse_Track::artist_id() const { + return artist_id_; +} +inline void AudioCollectionResponse_Track::set_artist_id(::google::protobuf::uint64 value) { + set_has_artist_id(); + artist_id_ = value; +} + +// required uint64 release_id = 3; +inline bool AudioCollectionResponse_Track::has_release_id() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void AudioCollectionResponse_Track::set_has_release_id() { + _has_bits_[0] |= 0x00000004u; +} +inline void AudioCollectionResponse_Track::clear_has_release_id() { + _has_bits_[0] &= ~0x00000004u; +} +inline void AudioCollectionResponse_Track::clear_release_id() { + release_id_ = GOOGLE_ULONGLONG(0); + clear_has_release_id(); +} +inline ::google::protobuf::uint64 AudioCollectionResponse_Track::release_id() const { + return release_id_; +} +inline void AudioCollectionResponse_Track::set_release_id(::google::protobuf::uint64 value) { + set_has_release_id(); + release_id_ = value; +} + +// repeated uint64 genre_id = 4; +inline int AudioCollectionResponse_Track::genre_id_size() const { + return genre_id_.size(); +} +inline void AudioCollectionResponse_Track::clear_genre_id() { + genre_id_.Clear(); +} +inline ::google::protobuf::uint64 AudioCollectionResponse_Track::genre_id(int index) const { + return genre_id_.Get(index); +} +inline void AudioCollectionResponse_Track::set_genre_id(int index, ::google::protobuf::uint64 value) { + genre_id_.Set(index, value); +} +inline void AudioCollectionResponse_Track::add_genre_id(::google::protobuf::uint64 value) { + genre_id_.Add(value); +} +inline const ::google::protobuf::RepeatedField< ::google::protobuf::uint64 >& +AudioCollectionResponse_Track::genre_id() const { + return genre_id_; +} +inline ::google::protobuf::RepeatedField< ::google::protobuf::uint64 >* +AudioCollectionResponse_Track::mutable_genre_id() { + return &genre_id_; +} + +// optional uint32 disc_number = 5; +inline bool AudioCollectionResponse_Track::has_disc_number() const { + return (_has_bits_[0] & 0x00000010u) != 0; +} +inline void AudioCollectionResponse_Track::set_has_disc_number() { + _has_bits_[0] |= 0x00000010u; +} +inline void AudioCollectionResponse_Track::clear_has_disc_number() { + _has_bits_[0] &= ~0x00000010u; +} inline void AudioCollectionResponse_Track::clear_disc_number() { disc_number_ = 0u; clear_has_disc_number(); @@ -3309,15 +3364,15 @@ inline void AudioCollectionResponse_Track::set_disc_number(::google::protobuf::u disc_number_ = value; } -// optional uint32 track_number = 3; +// optional uint32 track_number = 6; inline bool AudioCollectionResponse_Track::has_track_number() const { - return (_has_bits_[0] & 0x00000004u) != 0; + return (_has_bits_[0] & 0x00000020u) != 0; } inline void AudioCollectionResponse_Track::set_has_track_number() { - _has_bits_[0] |= 0x00000004u; + _has_bits_[0] |= 0x00000020u; } inline void AudioCollectionResponse_Track::clear_has_track_number() { - _has_bits_[0] &= ~0x00000004u; + _has_bits_[0] &= ~0x00000020u; } inline void AudioCollectionResponse_Track::clear_track_number() { track_number_ = 0u; @@ -3331,155 +3386,15 @@ inline void AudioCollectionResponse_Track::set_track_number(::google::protobuf:: track_number_ = value; } -// optional string artist = 4; -inline bool AudioCollectionResponse_Track::has_artist() const { - return (_has_bits_[0] & 0x00000008u) != 0; -} -inline void AudioCollectionResponse_Track::set_has_artist() { - _has_bits_[0] |= 0x00000008u; -} -inline void AudioCollectionResponse_Track::clear_has_artist() { - _has_bits_[0] &= ~0x00000008u; -} -inline void AudioCollectionResponse_Track::clear_artist() { - if (artist_ != &::google::protobuf::internal::kEmptyString) { - artist_->clear(); - } - clear_has_artist(); -} -inline const ::std::string& AudioCollectionResponse_Track::artist() const { - return *artist_; -} -inline void AudioCollectionResponse_Track::set_artist(const ::std::string& value) { - set_has_artist(); - if (artist_ == &::google::protobuf::internal::kEmptyString) { - artist_ = new ::std::string; - } - artist_->assign(value); -} -inline void AudioCollectionResponse_Track::set_artist(const char* value) { - set_has_artist(); - if (artist_ == &::google::protobuf::internal::kEmptyString) { - artist_ = new ::std::string; - } - artist_->assign(value); -} -inline void AudioCollectionResponse_Track::set_artist(const char* value, size_t size) { - set_has_artist(); - if (artist_ == &::google::protobuf::internal::kEmptyString) { - artist_ = new ::std::string; - } - artist_->assign(reinterpret_cast(value), size); -} -inline ::std::string* AudioCollectionResponse_Track::mutable_artist() { - set_has_artist(); - if (artist_ == &::google::protobuf::internal::kEmptyString) { - artist_ = new ::std::string; - } - return artist_; -} -inline ::std::string* AudioCollectionResponse_Track::release_artist() { - clear_has_artist(); - if (artist_ == &::google::protobuf::internal::kEmptyString) { - return NULL; - } else { - ::std::string* temp = artist_; - artist_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); - return temp; - } -} -inline void AudioCollectionResponse_Track::set_allocated_artist(::std::string* artist) { - if (artist_ != &::google::protobuf::internal::kEmptyString) { - delete artist_; - } - if (artist) { - set_has_artist(); - artist_ = artist; - } else { - clear_has_artist(); - artist_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); - } -} - -// optional string release = 5; -inline bool AudioCollectionResponse_Track::has_release() const { - return (_has_bits_[0] & 0x00000010u) != 0; -} -inline void AudioCollectionResponse_Track::set_has_release() { - _has_bits_[0] |= 0x00000010u; -} -inline void AudioCollectionResponse_Track::clear_has_release() { - _has_bits_[0] &= ~0x00000010u; -} -inline void AudioCollectionResponse_Track::clear_release() { - if (release_ != &::google::protobuf::internal::kEmptyString) { - release_->clear(); - } - clear_has_release(); -} -inline const ::std::string& AudioCollectionResponse_Track::release() const { - return *release_; -} -inline void AudioCollectionResponse_Track::set_release(const ::std::string& value) { - set_has_release(); - if (release_ == &::google::protobuf::internal::kEmptyString) { - release_ = new ::std::string; - } - release_->assign(value); -} -inline void AudioCollectionResponse_Track::set_release(const char* value) { - set_has_release(); - if (release_ == &::google::protobuf::internal::kEmptyString) { - release_ = new ::std::string; - } - release_->assign(value); -} -inline void AudioCollectionResponse_Track::set_release(const char* value, size_t size) { - set_has_release(); - if (release_ == &::google::protobuf::internal::kEmptyString) { - release_ = new ::std::string; - } - release_->assign(reinterpret_cast(value), size); -} -inline ::std::string* AudioCollectionResponse_Track::mutable_release() { - set_has_release(); - if (release_ == &::google::protobuf::internal::kEmptyString) { - release_ = new ::std::string; - } - return release_; -} -inline ::std::string* AudioCollectionResponse_Track::release_release() { - clear_has_release(); - if (release_ == &::google::protobuf::internal::kEmptyString) { - return NULL; - } else { - ::std::string* temp = release_; - release_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); - return temp; - } -} -inline void AudioCollectionResponse_Track::set_allocated_release(::std::string* release) { - if (release_ != &::google::protobuf::internal::kEmptyString) { - delete release_; - } - if (release) { - set_has_release(); - release_ = release; - } else { - clear_has_release(); - release_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); - } -} - -// required string name = 6; +// required string name = 7; inline bool AudioCollectionResponse_Track::has_name() const { - return (_has_bits_[0] & 0x00000020u) != 0; + return (_has_bits_[0] & 0x00000040u) != 0; } inline void AudioCollectionResponse_Track::set_has_name() { - _has_bits_[0] |= 0x00000020u; + _has_bits_[0] |= 0x00000040u; } inline void AudioCollectionResponse_Track::clear_has_name() { - _has_bits_[0] &= ~0x00000020u; + _has_bits_[0] &= ~0x00000040u; } inline void AudioCollectionResponse_Track::clear_name() { if (name_ != &::google::protobuf::internal::kEmptyString) { @@ -3541,15 +3456,15 @@ inline void AudioCollectionResponse_Track::set_allocated_name(::std::string* nam } } -// required uint32 duration_secs = 7; +// required uint32 duration_secs = 8; inline bool AudioCollectionResponse_Track::has_duration_secs() const { - return (_has_bits_[0] & 0x00000040u) != 0; + return (_has_bits_[0] & 0x00000080u) != 0; } inline void AudioCollectionResponse_Track::set_has_duration_secs() { - _has_bits_[0] |= 0x00000040u; + _has_bits_[0] |= 0x00000080u; } inline void AudioCollectionResponse_Track::clear_has_duration_secs() { - _has_bits_[0] &= ~0x00000040u; + _has_bits_[0] &= ~0x00000080u; } inline void AudioCollectionResponse_Track::clear_duration_secs() { duration_secs_ = 0u; @@ -3563,15 +3478,15 @@ inline void AudioCollectionResponse_Track::set_duration_secs(::google::protobuf: duration_secs_ = value; } -// optional string release_date = 8; +// optional string release_date = 9; inline bool AudioCollectionResponse_Track::has_release_date() const { - return (_has_bits_[0] & 0x00000080u) != 0; + return (_has_bits_[0] & 0x00000100u) != 0; } inline void AudioCollectionResponse_Track::set_has_release_date() { - _has_bits_[0] |= 0x00000080u; + _has_bits_[0] |= 0x00000100u; } inline void AudioCollectionResponse_Track::clear_has_release_date() { - _has_bits_[0] &= ~0x00000080u; + _has_bits_[0] &= ~0x00000100u; } inline void AudioCollectionResponse_Track::clear_release_date() { if (release_date_ != &::google::protobuf::internal::kEmptyString) { @@ -3633,15 +3548,15 @@ inline void AudioCollectionResponse_Track::set_allocated_release_date(::std::str } } -// optional string original_release_date = 9; +// optional string original_release_date = 10; inline bool AudioCollectionResponse_Track::has_original_release_date() const { - return (_has_bits_[0] & 0x00000100u) != 0; + return (_has_bits_[0] & 0x00000200u) != 0; } inline void AudioCollectionResponse_Track::set_has_original_release_date() { - _has_bits_[0] |= 0x00000100u; + _has_bits_[0] |= 0x00000200u; } inline void AudioCollectionResponse_Track::clear_has_original_release_date() { - _has_bits_[0] &= ~0x00000100u; + _has_bits_[0] &= ~0x00000200u; } inline void AudioCollectionResponse_Track::clear_original_release_date() { if (original_release_date_ != &::google::protobuf::internal::kEmptyString) { @@ -3703,50 +3618,6 @@ inline void AudioCollectionResponse_Track::set_allocated_original_release_date(: } } -// repeated string genres = 10; -inline int AudioCollectionResponse_Track::genres_size() const { - return genres_.size(); -} -inline void AudioCollectionResponse_Track::clear_genres() { - genres_.Clear(); -} -inline const ::std::string& AudioCollectionResponse_Track::genres(int index) const { - return genres_.Get(index); -} -inline ::std::string* AudioCollectionResponse_Track::mutable_genres(int index) { - return genres_.Mutable(index); -} -inline void AudioCollectionResponse_Track::set_genres(int index, const ::std::string& value) { - genres_.Mutable(index)->assign(value); -} -inline void AudioCollectionResponse_Track::set_genres(int index, const char* value) { - genres_.Mutable(index)->assign(value); -} -inline void AudioCollectionResponse_Track::set_genres(int index, const char* value, size_t size) { - genres_.Mutable(index)->assign( - reinterpret_cast(value), size); -} -inline ::std::string* AudioCollectionResponse_Track::add_genres() { - return genres_.Add(); -} -inline void AudioCollectionResponse_Track::add_genres(const ::std::string& value) { - genres_.Add()->assign(value); -} -inline void AudioCollectionResponse_Track::add_genres(const char* value) { - genres_.Add()->assign(value); -} -inline void AudioCollectionResponse_Track::add_genres(const char* value, size_t size) { - genres_.Add()->assign(reinterpret_cast(value), size); -} -inline const ::google::protobuf::RepeatedPtrField< ::std::string>& -AudioCollectionResponse_Track::genres() const { - return genres_; -} -inline ::google::protobuf::RepeatedPtrField< ::std::string>* -AudioCollectionResponse_Track::mutable_genres() { - return &genres_; -} - // optional bytes coverArt = 11; inline bool AudioCollectionResponse_Track::has_coverart() const { return (_has_bits_[0] & 0x00000400u) != 0; diff --git a/remote/proto/collection.proto b/remote/proto/collection.proto index cdad185c..87dfb7de 100644 --- a/remote/proto/collection.proto +++ b/remote/proto/collection.proto @@ -126,21 +126,16 @@ message AudioCollectionResponse { required uint64 id = 1; - optional uint32 disc_number = 2; - optional uint32 track_number = 3; - - optional string artist = 4; - optional string release = 5; - - required string name = 6; - - required uint32 duration_secs = 7; - - optional string release_date = 8; - optional string original_release_date = 9; - - repeated string genres = 10; + required uint64 artist_id = 2; + required uint64 release_id = 3; + repeated uint64 genre_id = 4; + optional uint32 disc_number = 5; + optional uint32 track_number = 6; + required string name = 7; + required uint32 duration_secs = 8; + optional string release_date = 9; + optional string original_release_date = 10; optional bytes coverArt = 11; } diff --git a/remote/server/AudioCollectionRequestHandler.cpp b/remote/server/AudioCollectionRequestHandler.cpp index 7f9da83d..a55fdfbd 100644 --- a/remote/server/AudioCollectionRequestHandler.cpp +++ b/remote/server/AudioCollectionRequestHandler.cpp @@ -1,4 +1,6 @@ -#include // std::max +#include // std::min + +#include #include "AudioCollectionRequestHandler.hpp" @@ -44,9 +46,27 @@ AudioCollectionRequestHandler::process(const AudioCollectionRequest& request, Au break; case AudioCollectionRequest_Type_TypeGetReleaseList: + if (request.has_get_releases()) + { + res = processGetReleases(request.get_releases(), *response.mutable_release_list()); + if (res) + response.set_type(AudioCollectionResponse_Type_TypeReleaseList); + + } + else + std::cerr << "Bad AudioCollectionRequest_Type_TypeGetReleaseList" << std::endl; break; case AudioCollectionRequest_Type_TypeGetTrackList: + if (request.has_get_tracks()) + { + res = processGetTracks(request.get_tracks(), *response.mutable_track_list()); + if (res) + response.set_type(AudioCollectionResponse_Type_TypeTrackList); + + } + else + std::cerr << "Bad AudioCollectionRequest_Type_TypeGetTrackList" << std::endl; break; default: @@ -67,16 +87,18 @@ AudioCollectionRequestHandler::processGetGenres(const AudioCollectionRequest::Ge return false; } - std::cout << "Offset = " << request.batch_parameter().offset() << std::endl; - std::cout << "Size = " << request.batch_parameter().size() << std::endl; + std::size_t size = request.batch_parameter().size(); + if (!size) + size = _maxListArtists; + size = std::min(size, _maxListArtists); Wt::Dbo::Transaction transaction( _db.getSession() ); - Wt::Dbo::collection genres = Genre::getAll( _db.getSession(), request.batch_parameter().offset(), std::max(static_cast(request.batch_parameter().size()), _maxListGenres) ); + Wt::Dbo::collection genres = Genre::getAll( _db.getSession(), request.batch_parameter().offset(), static_cast(size)); typedef Wt::Dbo::collection< Genre::pointer > Genres; - for (Genres::iterator it = genres.begin(); it != genres.end(); ++it) + for (Genres::const_iterator it = genres.begin(); it != genres.end(); ++it) { AudioCollectionResponse_Genre* genre = response.add_genres(); @@ -90,7 +112,6 @@ AudioCollectionRequestHandler::processGetGenres(const AudioCollectionRequest::Ge bool AudioCollectionRequestHandler::processGetArtists(const AudioCollectionRequest::GetArtistList& request, AudioCollectionResponse::ArtistList& response) { - // sanity checks if (!request.has_batch_parameter()) { @@ -98,31 +119,20 @@ AudioCollectionRequestHandler::processGetArtists(const AudioCollectionRequest::G return false; } - std::cout << "Offset = " << request.batch_parameter().offset() << std::endl; - std::cout << "Size = " << request.batch_parameter().size() << std::endl; - if (request.batch_parameter().size() > _maxListArtists) - std::cerr << "Warning: batch parameter size too high (" << request.batch_parameter().size() << ")" << std::endl; - - - for (int id = 0; id < request.genre_id_size(); ++id) - { - std::cout << "Genre id " << id << " = '" << request.genre_id(id) << "'" << std::endl; - } - + std::size_t size = request.batch_parameter().size(); + if (!size) + size = _maxListArtists; + size = std::min(size, _maxListArtists); // Now fetch requested data... - std::cout << "Getting artists..." << std::endl; - Wt::Dbo::Transaction transaction( _db.getSession() ); - Wt::Dbo::collection artists = Artist::getAll( _db.getSession(), request.batch_parameter().offset(), std::max(static_cast(request.batch_parameter().size()), _maxListArtists) ); - - std::cout << "size = " << artists.size() << std::endl; + Wt::Dbo::collection artists = Artist::getAll( _db.getSession(), request.batch_parameter().offset(), static_cast(size) ); typedef Wt::Dbo::collection< Artist::pointer > Artists; - for (Artists::iterator it = artists.begin(); it != artists.end(); ++it) + for (Artists::const_iterator it = artists.begin(); it != artists.end(); ++it) { AudioCollectionResponse_Artist* artist = response.add_artists(); @@ -131,7 +141,105 @@ AudioCollectionRequestHandler::processGetArtists(const AudioCollectionRequest::G artist->set_id(it->id()); } - std::cout << "Getting artists DONE" << std::endl; + return true; +} + +bool +AudioCollectionRequestHandler::processGetReleases(const AudioCollectionRequest::GetReleaseList& request, AudioCollectionResponse::ReleaseList& response) +{ + // sanity checks + if (!request.has_batch_parameter()) + { + std::cerr << "No batch parameters found!" << std::endl; + return false; + } + + std::size_t size = request.batch_parameter().size(); + if (!size) + size = _maxListReleases; + size = std::min(size, _maxListReleases); + + std::vector artistIds; + for (int id = 0; id < request.artist_id_size(); ++id) + artistIds.push_back( request.artist_id(id) ); + + Wt::Dbo::Transaction transaction( _db.getSession() ); + + Wt::Dbo::collection releases = Release::getAll( _db.getSession(), artistIds, request.batch_parameter().offset(), static_cast(size)); + + typedef Wt::Dbo::collection< Release::pointer > Releases; + + for (Releases::const_iterator it = releases.begin(); it != releases.end(); ++it) + { + AudioCollectionResponse_Release* release = response.add_releases(); + + release->set_name((*it)->getName()); + release->set_id(it->id()); + // WARNING: next two lines are very time consuming! + release->set_nb_tracks( (*it)->getTracks().size() ); + release->set_duration_secs( (*it)->getDuration().total_seconds() ); + } + + return true; +} + +bool +AudioCollectionRequestHandler::processGetTracks(const AudioCollectionRequest::GetTrackList& request, AudioCollectionResponse::TrackList& response) +{ + // sanity checks + if (!request.has_batch_parameter()) + { + std::cerr << "No batch parameters found!" << std::endl; + return false; + } + + std::size_t size = request.batch_parameter().size(); + if (!size) + size = _maxListTracks; + size = std::min(size, _maxListTracks); + + // Get filters + std::vector artistIds; + for (int id = 0; id < request.artist_id_size(); ++id) + artistIds.push_back( request.artist_id(id) ); + + std::vector releaseIds; + for (int id = 0; id < request.release_id_size(); ++id) + releaseIds.push_back( request.release_id(id) ); + + std::vector genreIds; + for (int id = 0; id < request.genre_id_size(); ++id) + genreIds.push_back( request.genre_id(id) ); + + Wt::Dbo::Transaction transaction( _db.getSession() ); + + Wt::Dbo::collection tracks = Track::getAll( _db.getSession(), + artistIds, releaseIds, genreIds, + request.batch_parameter().offset(), static_cast(size)); + + typedef Wt::Dbo::collection< Track::pointer > Tracks; + + for (Tracks::const_iterator it = tracks.begin(); it != tracks.end(); ++it) + { + AudioCollectionResponse_Track* track = response.add_tracks(); + + track->set_id(it->id()); + track->set_disc_number( (*it)->getDiscNumber() ); + track->set_track_number( (*it)->getTrackNumber() ); + track->set_artist_id( (*it)->getArtist().id() ); + track->set_release_id( (*it)->getRelease().id() ); + + track->set_name( (*it)->getName() ); + track->set_duration_secs( (*it)->getDuration().total_seconds() ); +// if (!(*it)->getCreationTime().is_special()) +// track->set_release_date( boost::posix_time::to_simple_string((*it)->getCreationTime()) ); + + BOOST_FOREACH(Genre::pointer genre, (*it)->getGenres()) + track->add_genre_id( genre.id() ); + +// if (!(*it)->getCoverArt().empty) +// track->set_coverart( (*it)->getCoverArt() ); + } return true; } diff --git a/remote/server/AudioCollectionRequestHandler.hpp b/remote/server/AudioCollectionRequestHandler.hpp index a079c9b8..6edf8895 100644 --- a/remote/server/AudioCollectionRequestHandler.hpp +++ b/remote/server/AudioCollectionRequestHandler.hpp @@ -19,13 +19,15 @@ class AudioCollectionRequestHandler bool processGetArtists(const AudioCollectionRequest::GetArtistList& request, AudioCollectionResponse::ArtistList& response); bool processGetGenres(const AudioCollectionRequest::GetGenreList& request, AudioCollectionResponse::GenreList& response); + bool processGetReleases(const AudioCollectionRequest::GetReleaseList& request, AudioCollectionResponse::ReleaseList& response); + bool processGetTracks(const AudioCollectionRequest::GetTrackList& request, AudioCollectionResponse::TrackList& response); DatabaseHandler& _db; - static const std::size_t _maxListArtists = 128; - static const std::size_t _maxListGenres = 128; - static const std::size_t _maxListReleases = 128; - static const std::size_t _maxListTracks = 32; + static const std::size_t _maxListArtists = 256; + static const std::size_t _maxListGenres = 256; + static const std::size_t _maxListReleases = 256; + static const std::size_t _maxListTracks = 256; }; } // namespace Remote diff --git a/remote/server/Connection.cpp b/remote/server/Connection.cpp index 4c9bfb11..50fe80fb 100644 --- a/remote/server/Connection.cpp +++ b/remote/server/Connection.cpp @@ -75,8 +75,6 @@ Connection::handleReadHeader(const boost::system::error_code& error, std::size_t return; } - std::cout << "Header received. Size = " << header.getSize() << std::endl; - // Now read the real message boost::asio::streambuf::mutable_buffers_type bufs = _inputStreamBuf.prepare(header.getSize()); diff --git a/test/CheckSqlQuery.cpp b/test/CheckSqlQuery.cpp index 601eb45c..fd45eabb 100644 --- a/test/CheckSqlQuery.cpp +++ b/test/CheckSqlQuery.cpp @@ -12,7 +12,7 @@ int main(void) SqlQuery query; - query.select().And( SelectStatement("artist.name")).And( SelectStatement("track.name")); + query.select("artist.name").And("track.name"); query.from().And( FromClause("artist") ).And( FromClause("track")); query.where().And( WhereClause("artist.id = track.artist_id") ); diff --git a/test/Makefile.am b/test/Makefile.am index e29bc944..036c63ed 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -21,6 +21,7 @@ remote_SOURCES = \ $(top_srcdir)/database/Release.cpp \ $(top_srcdir)/database/Track.cpp \ $(top_srcdir)/database/DatabaseHandler.cpp \ + $(top_srcdir)/database/SqlQuery.cpp \ $(top_srcdir)/database/Path.cpp \ $(top_srcdir)/database/Video.cpp \ $(top_srcdir)/database/Checksum.cpp @@ -34,6 +35,7 @@ database_integrity_SOURCES = \ $(top_srcdir)/database/Release.cpp \ $(top_srcdir)/database/Track.cpp \ $(top_srcdir)/database/DatabaseHandler.cpp \ + $(top_srcdir)/database/SqlQuery.cpp \ $(top_srcdir)/database/Path.cpp \ $(top_srcdir)/database/Video.cpp \ $(top_srcdir)/database/Checksum.cpp @@ -47,6 +49,7 @@ database_basics_SOURCES = \ $(top_srcdir)/database/Release.cpp \ $(top_srcdir)/database/Track.cpp \ $(top_srcdir)/database/DatabaseHandler.cpp \ + $(top_srcdir)/database/SqlQuery.cpp \ $(top_srcdir)/database/Path.cpp \ $(top_srcdir)/database/Video.cpp \ $(top_srcdir)/database/Checksum.cpp diff --git a/test/Makefile.in b/test/Makefile.in index 006b5e8d..46e81f7d 100644 --- a/test/Makefile.in +++ b/test/Makefile.in @@ -97,6 +97,7 @@ am_database_basics_OBJECTS = \ database_basics-Release.$(OBJEXT) \ database_basics-Track.$(OBJEXT) \ database_basics-DatabaseHandler.$(OBJEXT) \ + database_basics-SqlQuery.$(OBJEXT) \ database_basics-Path.$(OBJEXT) database_basics-Video.$(OBJEXT) \ database_basics-Checksum.$(OBJEXT) database_basics_OBJECTS = $(am_database_basics_OBJECTS) @@ -110,6 +111,7 @@ am_database_integrity_OBJECTS = \ database_integrity-Release.$(OBJEXT) \ database_integrity-Track.$(OBJEXT) \ database_integrity-DatabaseHandler.$(OBJEXT) \ + database_integrity-SqlQuery.$(OBJEXT) \ database_integrity-Path.$(OBJEXT) \ database_integrity-Video.$(OBJEXT) \ database_integrity-Checksum.$(OBJEXT) @@ -127,8 +129,8 @@ am_remote_OBJECTS = remote-RemoteClientServer.$(OBJEXT) \ remote-messages.pb.$(OBJEXT) remote-Artist.$(OBJEXT) \ remote-Genre.$(OBJEXT) remote-Release.$(OBJEXT) \ remote-Track.$(OBJEXT) remote-DatabaseHandler.$(OBJEXT) \ - remote-Path.$(OBJEXT) remote-Video.$(OBJEXT) \ - remote-Checksum.$(OBJEXT) + remote-SqlQuery.$(OBJEXT) remote-Path.$(OBJEXT) \ + remote-Video.$(OBJEXT) remote-Checksum.$(OBJEXT) remote_OBJECTS = $(am_remote_OBJECTS) remote_LDADD = $(LDADD) remote_LINK = $(CXXLD) $(remote_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ @@ -511,6 +513,7 @@ remote_SOURCES = \ $(top_srcdir)/database/Release.cpp \ $(top_srcdir)/database/Track.cpp \ $(top_srcdir)/database/DatabaseHandler.cpp \ + $(top_srcdir)/database/SqlQuery.cpp \ $(top_srcdir)/database/Path.cpp \ $(top_srcdir)/database/Video.cpp \ $(top_srcdir)/database/Checksum.cpp @@ -523,6 +526,7 @@ database_integrity_SOURCES = \ $(top_srcdir)/database/Release.cpp \ $(top_srcdir)/database/Track.cpp \ $(top_srcdir)/database/DatabaseHandler.cpp \ + $(top_srcdir)/database/SqlQuery.cpp \ $(top_srcdir)/database/Path.cpp \ $(top_srcdir)/database/Video.cpp \ $(top_srcdir)/database/Checksum.cpp @@ -535,6 +539,7 @@ database_basics_SOURCES = \ $(top_srcdir)/database/Release.cpp \ $(top_srcdir)/database/Track.cpp \ $(top_srcdir)/database/DatabaseHandler.cpp \ + $(top_srcdir)/database/SqlQuery.cpp \ $(top_srcdir)/database/Path.cpp \ $(top_srcdir)/database/Video.cpp \ $(top_srcdir)/database/Checksum.cpp @@ -612,6 +617,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/database_basics-Genre.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/database_basics-Path.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/database_basics-Release.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/database_basics-SqlQuery.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/database_basics-Track.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/database_basics-Video.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/database_integrity-Artist.Po@am__quote@ @@ -621,6 +627,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/database_integrity-Genre.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/database_integrity-Path.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/database_integrity-Release.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/database_integrity-SqlQuery.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/database_integrity-Track.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/database_integrity-Video.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/remote-Artist.Po@am__quote@ @@ -635,6 +642,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/remote-RemoteClientServer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/remote-RequestHandler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/remote-Server.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/remote-SqlQuery.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/remote-TestDatabase.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/remote-Track.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/remote-Video.Po@am__quote@ @@ -744,6 +752,20 @@ database_basics-DatabaseHandler.obj: $(top_srcdir)/database/DatabaseHandler.cpp @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(database_basics_CXXFLAGS) $(CXXFLAGS) -c -o database_basics-DatabaseHandler.obj `if test -f '$(top_srcdir)/database/DatabaseHandler.cpp'; then $(CYGPATH_W) '$(top_srcdir)/database/DatabaseHandler.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/database/DatabaseHandler.cpp'; fi` +database_basics-SqlQuery.o: $(top_srcdir)/database/SqlQuery.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(database_basics_CXXFLAGS) $(CXXFLAGS) -MT database_basics-SqlQuery.o -MD -MP -MF $(DEPDIR)/database_basics-SqlQuery.Tpo -c -o database_basics-SqlQuery.o `test -f '$(top_srcdir)/database/SqlQuery.cpp' || echo '$(srcdir)/'`$(top_srcdir)/database/SqlQuery.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/database_basics-SqlQuery.Tpo $(DEPDIR)/database_basics-SqlQuery.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$(top_srcdir)/database/SqlQuery.cpp' object='database_basics-SqlQuery.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(database_basics_CXXFLAGS) $(CXXFLAGS) -c -o database_basics-SqlQuery.o `test -f '$(top_srcdir)/database/SqlQuery.cpp' || echo '$(srcdir)/'`$(top_srcdir)/database/SqlQuery.cpp + +database_basics-SqlQuery.obj: $(top_srcdir)/database/SqlQuery.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(database_basics_CXXFLAGS) $(CXXFLAGS) -MT database_basics-SqlQuery.obj -MD -MP -MF $(DEPDIR)/database_basics-SqlQuery.Tpo -c -o database_basics-SqlQuery.obj `if test -f '$(top_srcdir)/database/SqlQuery.cpp'; then $(CYGPATH_W) '$(top_srcdir)/database/SqlQuery.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/database/SqlQuery.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/database_basics-SqlQuery.Tpo $(DEPDIR)/database_basics-SqlQuery.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$(top_srcdir)/database/SqlQuery.cpp' object='database_basics-SqlQuery.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(database_basics_CXXFLAGS) $(CXXFLAGS) -c -o database_basics-SqlQuery.obj `if test -f '$(top_srcdir)/database/SqlQuery.cpp'; then $(CYGPATH_W) '$(top_srcdir)/database/SqlQuery.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/database/SqlQuery.cpp'; fi` + database_basics-Path.o: $(top_srcdir)/database/Path.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(database_basics_CXXFLAGS) $(CXXFLAGS) -MT database_basics-Path.o -MD -MP -MF $(DEPDIR)/database_basics-Path.Tpo -c -o database_basics-Path.o `test -f '$(top_srcdir)/database/Path.cpp' || echo '$(srcdir)/'`$(top_srcdir)/database/Path.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/database_basics-Path.Tpo $(DEPDIR)/database_basics-Path.Po @@ -870,6 +892,20 @@ database_integrity-DatabaseHandler.obj: $(top_srcdir)/database/DatabaseHandler.c @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(database_integrity_CXXFLAGS) $(CXXFLAGS) -c -o database_integrity-DatabaseHandler.obj `if test -f '$(top_srcdir)/database/DatabaseHandler.cpp'; then $(CYGPATH_W) '$(top_srcdir)/database/DatabaseHandler.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/database/DatabaseHandler.cpp'; fi` +database_integrity-SqlQuery.o: $(top_srcdir)/database/SqlQuery.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(database_integrity_CXXFLAGS) $(CXXFLAGS) -MT database_integrity-SqlQuery.o -MD -MP -MF $(DEPDIR)/database_integrity-SqlQuery.Tpo -c -o database_integrity-SqlQuery.o `test -f '$(top_srcdir)/database/SqlQuery.cpp' || echo '$(srcdir)/'`$(top_srcdir)/database/SqlQuery.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/database_integrity-SqlQuery.Tpo $(DEPDIR)/database_integrity-SqlQuery.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$(top_srcdir)/database/SqlQuery.cpp' object='database_integrity-SqlQuery.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(database_integrity_CXXFLAGS) $(CXXFLAGS) -c -o database_integrity-SqlQuery.o `test -f '$(top_srcdir)/database/SqlQuery.cpp' || echo '$(srcdir)/'`$(top_srcdir)/database/SqlQuery.cpp + +database_integrity-SqlQuery.obj: $(top_srcdir)/database/SqlQuery.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(database_integrity_CXXFLAGS) $(CXXFLAGS) -MT database_integrity-SqlQuery.obj -MD -MP -MF $(DEPDIR)/database_integrity-SqlQuery.Tpo -c -o database_integrity-SqlQuery.obj `if test -f '$(top_srcdir)/database/SqlQuery.cpp'; then $(CYGPATH_W) '$(top_srcdir)/database/SqlQuery.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/database/SqlQuery.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/database_integrity-SqlQuery.Tpo $(DEPDIR)/database_integrity-SqlQuery.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$(top_srcdir)/database/SqlQuery.cpp' object='database_integrity-SqlQuery.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(database_integrity_CXXFLAGS) $(CXXFLAGS) -c -o database_integrity-SqlQuery.obj `if test -f '$(top_srcdir)/database/SqlQuery.cpp'; then $(CYGPATH_W) '$(top_srcdir)/database/SqlQuery.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/database/SqlQuery.cpp'; fi` + database_integrity-Path.o: $(top_srcdir)/database/Path.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(database_integrity_CXXFLAGS) $(CXXFLAGS) -MT database_integrity-Path.o -MD -MP -MF $(DEPDIR)/database_integrity-Path.Tpo -c -o database_integrity-Path.o `test -f '$(top_srcdir)/database/Path.cpp' || echo '$(srcdir)/'`$(top_srcdir)/database/Path.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/database_integrity-Path.Tpo $(DEPDIR)/database_integrity-Path.Po @@ -1150,6 +1186,20 @@ remote-DatabaseHandler.obj: $(top_srcdir)/database/DatabaseHandler.cpp @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(remote_CXXFLAGS) $(CXXFLAGS) -c -o remote-DatabaseHandler.obj `if test -f '$(top_srcdir)/database/DatabaseHandler.cpp'; then $(CYGPATH_W) '$(top_srcdir)/database/DatabaseHandler.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/database/DatabaseHandler.cpp'; fi` +remote-SqlQuery.o: $(top_srcdir)/database/SqlQuery.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(remote_CXXFLAGS) $(CXXFLAGS) -MT remote-SqlQuery.o -MD -MP -MF $(DEPDIR)/remote-SqlQuery.Tpo -c -o remote-SqlQuery.o `test -f '$(top_srcdir)/database/SqlQuery.cpp' || echo '$(srcdir)/'`$(top_srcdir)/database/SqlQuery.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/remote-SqlQuery.Tpo $(DEPDIR)/remote-SqlQuery.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$(top_srcdir)/database/SqlQuery.cpp' object='remote-SqlQuery.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(remote_CXXFLAGS) $(CXXFLAGS) -c -o remote-SqlQuery.o `test -f '$(top_srcdir)/database/SqlQuery.cpp' || echo '$(srcdir)/'`$(top_srcdir)/database/SqlQuery.cpp + +remote-SqlQuery.obj: $(top_srcdir)/database/SqlQuery.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(remote_CXXFLAGS) $(CXXFLAGS) -MT remote-SqlQuery.obj -MD -MP -MF $(DEPDIR)/remote-SqlQuery.Tpo -c -o remote-SqlQuery.obj `if test -f '$(top_srcdir)/database/SqlQuery.cpp'; then $(CYGPATH_W) '$(top_srcdir)/database/SqlQuery.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/database/SqlQuery.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/remote-SqlQuery.Tpo $(DEPDIR)/remote-SqlQuery.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$(top_srcdir)/database/SqlQuery.cpp' object='remote-SqlQuery.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(remote_CXXFLAGS) $(CXXFLAGS) -c -o remote-SqlQuery.obj `if test -f '$(top_srcdir)/database/SqlQuery.cpp'; then $(CYGPATH_W) '$(top_srcdir)/database/SqlQuery.cpp'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/database/SqlQuery.cpp'; fi` + remote-Path.o: $(top_srcdir)/database/Path.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(remote_CXXFLAGS) $(CXXFLAGS) -MT remote-Path.o -MD -MP -MF $(DEPDIR)/remote-Path.Tpo -c -o remote-Path.o `test -f '$(top_srcdir)/database/Path.cpp' || echo '$(srcdir)/'`$(top_srcdir)/database/Path.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/remote-Path.Tpo $(DEPDIR)/remote-Path.Po diff --git a/test/RemoteClientServer.cpp b/test/RemoteClientServer.cpp index 1c5047ad..50e73de8 100644 --- a/test/RemoteClientServer.cpp +++ b/test/RemoteClientServer.cpp @@ -20,7 +20,7 @@ struct GenreInfo std::ostream& operator<<(std::ostream& os, const GenreInfo& info) { - os << "id = " << info.id << ", name = '" << info.name << "'" << std::endl; + os << "id = " << info.id << ", name = '" << info.name << "'"; return os; } @@ -32,10 +32,47 @@ struct ArtistInfo std::ostream& operator<<(std::ostream& os, const ArtistInfo& info) { - os << "id = " << info.id << ", name = '" << info.name << "'" << std::endl; + os << "id = " << info.id << ", name = '" << info.name << "'"; return os; } +struct ReleaseInfo +{ + uint64_t id; + std::string name; + std::size_t nbTracks; + boost::posix_time::time_duration duration; +}; + +std::ostream& operator<<(std::ostream& os, const ReleaseInfo& info) +{ + os << "id = " << info.id << ", name = '" << info.name << "', tracks = " << info.nbTracks << ", duration = " << info.duration; + return os; +} + +struct TrackInfo +{ + uint64_t id; + + uint64_t release_id; + uint64_t artist_id; + std::vector genre_id; + + uint32_t disc_number; + uint32_t track_number; + + std::string name; + + boost::posix_time::time_duration duration; +}; + +std::ostream& operator<<(std::ostream& os, const TrackInfo& info) +{ + os << "id = " << info.id << ", name = '" << info.name << "', track_number = " << info.track_number << ", duration = " << info.duration; + return os; +} + + // Ugly class for testing purposes class TestServer { @@ -80,7 +117,7 @@ class TestClient void getArtists(std::vector& artists) { - const std::size_t requestedBatchSize = 32; + const std::size_t requestedBatchSize = 128; std::size_t offset = 0; std::size_t res = 0; @@ -135,7 +172,7 @@ class TestClient void getGenres(std::vector& genres) { - const std::size_t requestedBatchSize = 8; + const std::size_t requestedBatchSize = 128; std::size_t offset = 0; std::size_t res = 0; @@ -182,11 +219,128 @@ class TestClient genres.push_back( genre ); nbAdded++; } - - return nbAdded; } + void getReleases(std::vector& releases, const std::vector artistIds) + { + + const std::size_t requestedBatchSize = 128; + std::size_t offset = 0; + std::size_t res = 0; + + while ((res = getReleases(releases, artistIds, offset, requestedBatchSize) ) > 0) + offset += res; + + } + + std::size_t getReleases(std::vector& releases, const std::vector artistIds, std::size_t offset, std::size_t size) + { + std::size_t nbAdded = 0; + + // Send request + Remote::ClientMessage request; + + request.set_type( Remote::ClientMessage_Type_AudioCollectionRequest ); + + request.mutable_audio_collection_request()->set_type( Remote::AudioCollectionRequest_Type_TypeGetReleaseList); + request.mutable_audio_collection_request()->mutable_get_releases()->mutable_batch_parameter()->set_size(size); + request.mutable_audio_collection_request()->mutable_get_releases()->mutable_batch_parameter()->set_offset(offset); + BOOST_FOREACH(uint64_t artistId, artistIds) + request.mutable_audio_collection_request()->mutable_get_releases()->add_artist_id(artistId); + + sendMsg(request); + + // Receive responses + Remote::ServerMessage response; + recvMsg(response); + + // Process message + if (!response.has_audio_collection_response()) + throw std::runtime_error("not an audio_collection_response!"); + + if (!response.audio_collection_response().has_release_list()) + throw std::runtime_error("not an release list!"); + + for (int i = 0; i < response.audio_collection_response().release_list().releases_size(); ++i) + { + if (!response.audio_collection_response().release_list().releases(i).has_name()) + throw std::runtime_error("no release name!"); + + ReleaseInfo release; + release.id = response.audio_collection_response().release_list().releases(i).id(); + release.name = response.audio_collection_response().release_list().releases(i).name(); + release.duration = boost::posix_time::seconds(response.audio_collection_response().release_list().releases(i).duration_secs()); + release.nbTracks = response.audio_collection_response().release_list().releases(i).nb_tracks(); + + releases.push_back( release ); + nbAdded++; + } + return nbAdded; + } + + void getTracks(std::vector& tracks, const std::vector artistIds, const std::vector releaseIds, const std::vector genreIds) + { + const std::size_t requestedBatchSize = 256; + std::size_t offset = 0; + std::size_t res = 0; + + while ((res = getTracks(tracks, artistIds, releaseIds, genreIds, offset, requestedBatchSize) ) > 0) + offset += res; + } + + std::size_t getTracks(std::vector& tracks, + const std::vector artistIds, + const std::vector releaseIds, + const std::vector genreIds, + std::size_t offset, + std::size_t size) + { + std::size_t nbAdded = 0; + + // Send request + Remote::ClientMessage request; + + request.set_type( Remote::ClientMessage_Type_AudioCollectionRequest ); + + request.mutable_audio_collection_request()->set_type( Remote::AudioCollectionRequest_Type_TypeGetTrackList); + request.mutable_audio_collection_request()->mutable_get_tracks()->mutable_batch_parameter()->set_size(size); + request.mutable_audio_collection_request()->mutable_get_tracks()->mutable_batch_parameter()->set_offset(offset); + + BOOST_FOREACH(uint64_t artistId, artistIds) + request.mutable_audio_collection_request()->mutable_get_tracks()->add_artist_id(artistId); + BOOST_FOREACH(uint64_t releaseId, releaseIds) + request.mutable_audio_collection_request()->mutable_get_tracks()->add_release_id(releaseId); + BOOST_FOREACH(uint64_t genreId, genreIds) + request.mutable_audio_collection_request()->mutable_get_tracks()->add_genre_id(genreId); + + sendMsg(request); + + // Receive responses + Remote::ServerMessage response; + recvMsg(response); + + // Process message + if (!response.has_audio_collection_response()) + throw std::runtime_error("not an audio_collection_response!"); + + if (!response.audio_collection_response().has_track_list()) + throw std::runtime_error("not an track list!"); + + for (int i = 0; i < response.audio_collection_response().track_list().tracks_size(); ++i) + { + + TrackInfo track; + track.id = response.audio_collection_response().track_list().tracks(i).id(); + track.name = response.audio_collection_response().track_list().tracks(i).name(); + track.duration = boost::posix_time::seconds(response.audio_collection_response().track_list().tracks(i).duration_secs()); + + tracks.push_back( track ); + nbAdded++; + } + + return nbAdded; + } private: @@ -217,7 +371,6 @@ class TestClient _outputStreamBuf.consume(n); - std::cout << "Client: Message sent!" << std::endl; } else { @@ -235,7 +388,6 @@ class TestClient // reserve bytes in output sequence boost::asio::streambuf::mutable_buffers_type bufs = _inputStreamBuf.prepare(Remote::Header::size); - std::cout << "Client: waiting for header message!" << std::endl; std::size_t n = boost::asio::read(_socket, bufs, boost::asio::transfer_exactly(Remote::Header::size)); @@ -243,7 +395,6 @@ class TestClient assert(n == Remote::Header::size); _inputStreamBuf.commit(n); - std::cout << "Client: Header message received!" << std::endl; } Remote::Header header; @@ -255,7 +406,6 @@ class TestClient // reserve bytes in output sequence boost::asio::streambuf::mutable_buffers_type bufs = _inputStreamBuf.prepare(header.getSize()); - std::cout << "Client: waiting for message!" << std::endl; std::size_t n = boost::asio::read(_socket, bufs, boost::asio::transfer_exactly(header.getSize())); @@ -263,8 +413,6 @@ class TestClient assert(n == header.getSize()); _inputStreamBuf.commit(n); - std::cout << "Client: message received!" << std::endl; - if (!message.ParseFromIstream(&is)) throw std::runtime_error("message.ParseFromIstream failed!"); @@ -310,8 +458,32 @@ int main() BOOST_FOREACH(const GenreInfo& genre, genres) std::cout << "Genre: '" << genre << "'" << std::endl; - testServer.stop(); + // **** Releases ****** + std::vector releases; + client.getReleases(releases, std::vector(1, 1162)); + BOOST_FOREACH(const ReleaseInfo& release, releases) + std::cout << "Release: '" << release << "'" << std::endl; + // **** Tracks ****** +/* { + std::vector tracks; + client.getTracks(tracks, std::vector(), std::vector(), std::vector()); + BOOST_FOREACH(const TrackInfo& track, tracks) + std::cout << "Track: '" << track << "'" << std::endl; + }*/ + + BOOST_FOREACH(const ArtistInfo& artist, artists) + { + // Get the tracks for each artist + std::vector tracks; + client.getTracks(tracks, std::vector(1, artist.id), std::vector(), std::vector()); + + std::cout << "Artist '" << artist.name << "', nb tracks = " << tracks.size() << std::endl; + BOOST_FOREACH(const TrackInfo& track, tracks) + std::cout << "Track: '" << track << "'" << std::endl; + } + + testServer.stop(); } catch(std::exception& e) { diff --git a/ui/audio/TableFilterWidget.cpp b/ui/audio/TableFilterWidget.cpp index 6177e3a7..ab370293 100644 --- a/ui/audio/TableFilterWidget.cpp +++ b/ui/audio/TableFilterWidget.cpp @@ -22,7 +22,6 @@ _tableView(nullptr) _tableView->setAlternatingRowColors(true); _tableView->setModel(&_queryModel); - _tableView->selectionChanged().connect(this, &TableFilterWidget::emitUpdate); _tableView->selectionChanged().connect(this, &TableFilterWidget::emitUpdate); _queryModel.setBatchSize(100); @@ -34,13 +33,13 @@ TableFilterWidget::refresh(const Constraint& constraint) { SqlQuery sqlQuery; - sqlQuery.select().And( _table + "." + _field + ",count(DISTINCT track.id),0 as ORDERBY"); + sqlQuery.select(_table + "." + _field + ",count(DISTINCT track.id),0 as ORDERBY"); sqlQuery.from().And( FromClause("artist,release,track,genre,track_genre")) ; sqlQuery.where().And(constraint.where); // Add constraint made by other filters sqlQuery.groupBy().And( _table + "." + _field); // Add constraint made by other filters SqlQuery AllSqlQuery; - AllSqlQuery.select().And( SelectStatement("'',0,1 AS ORDERBY") ); + AllSqlQuery.select("'',0,1 AS ORDERBY"); std::cout << _table << ", generated query = '" << sqlQuery.get() + " UNION " + AllSqlQuery.get() << "'" << std::endl; diff --git a/ui/audio/TableFilterWidget.hpp b/ui/audio/TableFilterWidget.hpp index 912ba553..bb07b898 100644 --- a/ui/audio/TableFilterWidget.hpp +++ b/ui/audio/TableFilterWidget.hpp @@ -28,6 +28,7 @@ class TableFilterWidget : public FilterWidget const std::string _table; const std::string _field; + // Name, track count, special value that means 'all' if set to 1 typedef boost::tuple ResultType; Wt::Dbo::QueryModel< ResultType > _queryModel; diff --git a/ui/audio/TrackWidget.cpp b/ui/audio/TrackWidget.cpp index 05c5b23c..afa5d1b2 100644 --- a/ui/audio/TrackWidget.cpp +++ b/ui/audio/TrackWidget.cpp @@ -72,7 +72,7 @@ TrackWidget::refresh(const Constraint& constraint) SqlQuery sqlQuery; - sqlQuery.select().And( SelectStatement( "track,release,artist" ) ); + sqlQuery.select( "track,release,artist" ); sqlQuery.from().And( FromClause("artist,release,track,genre,track_genre")); sqlQuery.where().And(constraint.where);