db/proxy: split search into chunks to avoid exceeding the output buffer
Closes https://github.com/MusicPlayerDaemon/MPD/issues/1130
This commit is contained in:
parent
22ebb2bdd5
commit
85db2d6704
1
NEWS
1
NEWS
|
@ -5,6 +5,7 @@ ver 0.23 (not yet released)
|
||||||
* database
|
* database
|
||||||
- proxy: require MPD 0.20 or later
|
- proxy: require MPD 0.20 or later
|
||||||
- proxy: require libmpdclient 2.11 or later
|
- proxy: require libmpdclient 2.11 or later
|
||||||
|
- proxy: split search into chunks to avoid exceeding the output buffer
|
||||||
* output
|
* output
|
||||||
- pipewire: new plugin
|
- pipewire: new plugin
|
||||||
- snapcast: new plugin
|
- snapcast: new plugin
|
||||||
|
|
|
@ -825,12 +825,25 @@ try {
|
||||||
const bool exact = selection.filter == nullptr ||
|
const bool exact = selection.filter == nullptr ||
|
||||||
!selection.filter->HasFoldCase();
|
!selection.filter->HasFoldCase();
|
||||||
|
|
||||||
|
/* request only this number of songs at a time to avoid
|
||||||
|
blowing the server's max_output_buffer_size limit */
|
||||||
|
constexpr unsigned LIMIT = 4096;
|
||||||
|
|
||||||
|
auto remaining_window = selection.window;
|
||||||
|
|
||||||
|
while (remaining_window.start < remaining_window.end) {
|
||||||
|
auto window = remaining_window;
|
||||||
|
if (window.end - window.start > LIMIT)
|
||||||
|
window.end = window.start + LIMIT;
|
||||||
|
|
||||||
if (!mpd_search_db_songs(connection, exact) ||
|
if (!mpd_search_db_songs(connection, exact) ||
|
||||||
!SendConstraints(connection, selection, selection.window) ||
|
!SendConstraints(connection, selection, window) ||
|
||||||
!mpd_search_commit(connection))
|
!mpd_search_commit(connection))
|
||||||
ThrowError(connection);
|
ThrowError(connection);
|
||||||
|
|
||||||
while (auto *song = mpd_recv_song(connection)) {
|
while (auto *song = mpd_recv_song(connection)) {
|
||||||
|
++window.start;
|
||||||
|
|
||||||
AllocatedProxySong song2(song);
|
AllocatedProxySong song2(song);
|
||||||
|
|
||||||
if (Match(selection.filter, song2)) {
|
if (Match(selection.filter, song2)) {
|
||||||
|
@ -845,6 +858,15 @@ try {
|
||||||
|
|
||||||
if (!mpd_response_finish(connection))
|
if (!mpd_response_finish(connection))
|
||||||
ThrowError(connection);
|
ThrowError(connection);
|
||||||
|
|
||||||
|
if (window.start != window.end)
|
||||||
|
/* the other MPD has given us less than we
|
||||||
|
requested - this means there's no more
|
||||||
|
data */
|
||||||
|
break;
|
||||||
|
|
||||||
|
remaining_window.start = window.end;
|
||||||
|
}
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
if (connection != nullptr)
|
if (connection != nullptr)
|
||||||
mpd_search_cancel(connection);
|
mpd_search_cancel(connection);
|
||||||
|
|
Loading…
Reference in New Issue