ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/DecentralizedMedia/Library.cpp
(Generate patch)

Comparing DecentralizedMedia/Library.cpp (file contents):
Revision 551 by douglas, 2005-07-04T23:37:40-07:00 vs.
Revision 552 by douglas, 2005-07-07T04:05:55-07:00

# Line 15 | Line 15 | Library::Library(const _R<dbi::Connectio
15          connection->Execute(_B("UPDATE files SET live = FALSE"));
16   }
17  
18 < _L<cse::String> Library::GetArtists() const
18 > _L<MediaFolder> Library::GetFolders() const
19   {
20 <        _R<dbi::ResultSet> artists_(connection->Execute(_B("SELECT DISTINCT artist FROM files WHERE live = TRUE ORDER BY artist")));
21 <        _L<cse::String> artists;
20 >        _R<dbi::ResultSet> roots(connection->Execute(_B("SELECT DISTINCT root FROM files WHERE live = TRUE ORDER By root")));
21 >        _L<MediaFolder> folders;
22  
23 <        while (artists_->MoveNext())
24 <                artists.InsertLast(artists_->GetString(_B("artist")));
23 >        while (roots->MoveNext())
24 >                folders.InsertLast(GetFolder(roots->GetString(_B("root"))));
25  
26 <        return artists;
26 >        return folders;
27   }
28  
29 < _L<cse::String> Library::GetTitles() const
29 > _L<MediaFile> Library::GetFiles(const _L<By>& bys, const _L<cse::String>& items) const
30   {
31 <        _R<dbi::ResultSet> titles_(connection->Execute(_B("SELECT DISTINCT title FROM files WHERE live = TRUE ORDER BY title")));
32 <        _L<cse::String> titles;
31 >        if (bys.IsEmpty() || ext::Contains(bys, By::LAST) || bys.GetSize() != items.GetSize())
32 >                return _L<MediaFile>();
33  
34 <        while (titles_->MoveNext())
35 <                titles.InsertLast(titles_->GetString(_B("title")));
34 >        _S<ios::String> statement_;
35  
36 <        return titles;
38 < }
36 >        statement_ << _B("SELECT path FROM files WHERE live = TRUE ");
37  
38 < _L<cse::String> Library::GetAlbums() const
39 < {
42 <        _R<dbi::ResultSet> albums_(connection->Execute(_B("SELECT DISTINCT album FROM files WHERE live = TRUE ORDER BY album")));
43 <        _L<cse::String> albums;
38 >        _foreach (const _L<By>, by, bys)
39 >                statement_ << _B("AND ") << by << _B(" = ? ");
40  
41 <        while (albums_->MoveNext())
42 <                albums.InsertLast(albums_->GetString(_B("album")));
41 >        _rforeach (const _L<By>, by, bys)
42 >                statement_ << _B(by + 1 == _set.End() ? "ORDER BY " : ", ") << *by;
43  
44 <        return albums;
49 < }
44 >        _R<dbi::Statement> statement(connection->Parse(statement_));
45  
46 < _L<cse::String> Library::GetGenres() const
47 < {
53 <        _R<dbi::ResultSet> genres_(connection->Execute(_B("SELECT DISTINCT genre FROM files WHERE live = TRUE ORDER BY genre")));
54 <        _L<cse::String> genres;
46 >        _foreach (const _L<cse::String>, item, items)
47 >                statement->Set(_index, *item);
48  
49 <        while (genres_->MoveNext())
50 <                genres.InsertLast(genres_->GetString(_B("genre")));
49 >        _R<dbi::ResultSet> paths(statement->Execute());
50 >        _L<MediaFile> files;
51  
52 <        return genres;
52 >        while (paths->MoveNext())
53 >                files.InsertLast(GetFile(paths->GetString(_B("path"))));
54 >
55 >        return files;
56   }
57  
58 < _L<MediaFolder> Library::GetFolders() const
58 > _L<cse::String> Library::GetItems(_L<By> bys, _L<cse::String> items) const
59   {
60 <        _R<dbi::ResultSet> roots(connection->Execute(_B("SELECT DISTINCT root FROM files WHERE live = TRUE ORDER By root")));
61 <        _L<MediaFolder> folders;
60 >        if (bys.IsEmpty() || ext::Contains(bys, By::LAST) || bys.GetSize() - 1 != items.GetSize())
61 >                return _L<cse::String>();
62  
63 <        while (roots->MoveNext())
64 <                folders.InsertLast(MediaFolder(connection, roots->GetString(_B("root"))));
63 >        _S<ios::String> statement_;
64 >        By by(bys.Last());
65 >        
66 >        statement_ << _B("SELECT DISTINCT ") << by << _B(" FROM files WHERE live = TRUE ");
67  
68 <        return folders;
68 >        bys.RemoveLast();
69 >
70 >        _foreach (const _L<By>, by_, bys)
71 >                statement_ << _B("AND ") << *by_ << _B(" = ? ");
72 >
73 >        statement_ << _B("ORDER BY ") << by;
74 >
75 >        _rforeach (const _L<By>, by_, bys)
76 >                statement_ << _B(", ") << *by_;
77 >
78 >        _R<dbi::Statement> statement(connection->Parse(statement_));
79 >
80 >        _foreach (const _L<cse::String>, item, items)
81 >                statement->Set(_index, *item);
82 >
83 >        _R<dbi::ResultSet> items_(statement->Execute());
84 >        
85 >        items.Clear();
86 >
87 >        while (items_->MoveNext())
88 >                items.InsertLast(items_->GetString(by));
89 >
90 >        return items;
91   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines