// Media Folder // // Douglas Thrift // // $Id$ #include #include #include "MediaFolder.hpp" #include "Share.hpp" MediaFolder::MediaFolder(const _R& connector, const api::Path& path) : connector(connector), path(path) { _R connection(connector->Connect()); _R root_(connection->Parse(_B("SELECT root FROM folders WHERE path = ?"))->Execute(path.GetPath())); if (root_->MoveNext()) root = root_->GetString(_B("root")); connector->Release(connection); } MediaFolder::MediaFolder(const _R& connector, const api::Path& path, const api::Path& root) : connector(connector), path(path), root(root) { _R connection(connector->Connect()); _R path_(connection->Parse(_B("SELECT path FROM folders WHERE path = ?"))->Execute(path.GetPath())); if (path_->MoveNext()) if (path.GetPath() != root.GetPath()) connection->Parse(_B("UPDATE folders SET folder = ?, root = ? WHERE path = ?"))->Execute(path.GetParent().GetPath(), root.GetPath(), path.GetPath()); else connection->Parse(_B("UPDATE folders SET folder = NULL, root = ? WHERE path = ?"))->Execute(root.GetPath(), path.GetPath()); else if (path.GetPath() != root.GetPath()) connection->Parse(_B("INSERT INTO folders (path, folder, root) VALUES (?, ?, ?)"))->Execute(path.GetPath(), path.GetParent().GetPath(), root.GetPath()); else connection->Parse(_B("INSERT INTO folders (path, folder, root) VALUES (?, NULL, ?)"))->Execute(path.GetPath(), root.GetPath()); connector->Release(connection); } cse::String MediaFolder::GetName() const { if (path == root && path.GetPath().StartsWithAll(Share::shares.GetPath())) { api::Address address(api::Address::Resolve(path.GetParent().GetName(), _B("6996")).First()); cse::String host, port; address.ToString(host, port, true); return _S() << _B("Share from ") << host; } else return path.GetName(); } _L MediaFolder::GetFiles(unsigned page) const { _R connection(connector->Connect()); _R paths(connection->Parse(_B("SELECT path FROM files WHERE live = TRUE AND folder = ? ORDER BY path LIMIT 50 OFFSET ?"))->Execute(path.GetPath(), page * 50)); _L files; while (paths->MoveNext()) files.InsertLast(MediaFile(connector, paths->GetString(_B("path")))); connector->Release(connection); return files; } unsigned MediaFolder::GetFilesPages() const { _R connection(connector->Connect()); _R count(connection->Parse(_B("SELECT count(path) FROM files WHERE live = TRUE AND folder = ?"))->Execute(path.GetPath())); unsigned pages(0); if (count->MoveNext()) pages = (count->Get(_B("count")) + 49) / 50; connector->Release(connection); return pages; } _L MediaFolder::GetFolders(unsigned page) const { _R connection(connector->Connect()); _R paths(connection->Parse(_B("SELECT path FROM folders WHERE folder = ? ORDER BY path LIMIT 50 OFFSET ?"))->Execute(path.GetPath(), page * 50)); _L folders; while (paths->MoveNext()) folders.InsertLast(MediaFolder(connector, paths->GetString(_B("path")))); connector->Release(connection); return folders; } unsigned MediaFolder::GetFoldersPages() const { _R connection(connector->Connect()); _R count(connection->Parse(_B("SELECT count(path) FROM folders WHERE folder = ?"))->Execute(path.GetPath())); unsigned pages(0); if (count->MoveNext()) pages = (count->Get(_B("count")) + 49) / 50; connector->Release(connection); return pages; }