[db] Remove db_queue_enum struct and use generic query_params

This commit is contained in:
chme 2016-12-04 08:18:33 +01:00
parent b9117f9abd
commit fb55960b0a
4 changed files with 177 additions and 199 deletions

281
src/db.c
View File

@ -299,6 +299,8 @@ static const char *sort_clause[] =
"ORDER BY f.disc ASC", "ORDER BY f.disc ASC",
"ORDER BY f.track ASC", "ORDER BY f.track ASC",
"ORDER BY f.virtual_path ASC", "ORDER BY f.virtual_path ASC",
"ORDER BY pos ASC",
"ORDER BY shuffle_pos ASC",
}; };
/* Shuffle RNG state */ /* Shuffle RNG state */
@ -4549,22 +4551,22 @@ db_queue_add_by_fileid(int id, char reshuffle, uint32_t item_id)
} }
static int static int
queue_enum_start(struct db_queue_enum *queue_enum) queue_enum_start(struct query_params *query_params)
{ {
#define Q_TMPL "SELECT * FROM queue WHERE %s ORDER BY %s;" #define Q_TMPL "SELECT * FROM queue WHERE %s ORDER BY %s;"
char *query; char *query;
char *orderby; const char *orderby;
int ret; int ret;
queue_enum->stmt = NULL; query_params->stmt = NULL;
if (queue_enum->orderby_shufflepos) if (query_params)
orderby = "shuffle_pos"; orderby = sort_clause[query_params->sort];
else else
orderby = "pos"; orderby = sort_clause[S_POS];
if (queue_enum->filter) if (query_params->filter)
query = sqlite3_mprintf(Q_TMPL, queue_enum->filter, orderby); query = sqlite3_mprintf(Q_TMPL, query_params->filter, orderby);
else else
query = sqlite3_mprintf(Q_TMPL, "1=1", orderby); query = sqlite3_mprintf(Q_TMPL, "1=1", orderby);
@ -4577,7 +4579,7 @@ queue_enum_start(struct db_queue_enum *queue_enum)
DPRINTF(E_DBG, L_DB, "Starting enum '%s'\n", query); DPRINTF(E_DBG, L_DB, "Starting enum '%s'\n", query);
ret = db_blocking_prepare_v2(query, -1, &queue_enum->stmt, NULL); ret = db_blocking_prepare_v2(query, -1, &query_params->stmt, NULL);
if (ret != SQLITE_OK) if (ret != SQLITE_OK)
{ {
DPRINTF(E_LOG, L_DB, "Could not prepare statement: %s\n", sqlite3_errmsg(hdl)); DPRINTF(E_LOG, L_DB, "Could not prepare statement: %s\n", sqlite3_errmsg(hdl));
@ -4593,18 +4595,6 @@ queue_enum_start(struct db_queue_enum *queue_enum)
#undef Q_TMPL #undef Q_TMPL
} }
static void
queue_enum_end(struct db_queue_enum *queue_enum)
{
if (!queue_enum->stmt)
return;
sqlite3_finalize(queue_enum->stmt);
sqlite3_free(queue_enum->filter);
queue_enum->filter = NULL;
queue_enum->stmt = NULL;
}
static inline char * static inline char *
strdup_if(char *str, int cond) strdup_if(char *str, int cond)
{ {
@ -4618,19 +4608,19 @@ strdup_if(char *str, int cond)
} }
static int static int
queue_enum_fetch(struct db_queue_enum *queue_enum, struct db_queue_item *queue_item, int keep_item) queue_enum_fetch(struct query_params *query_params, struct db_queue_item *queue_item, int keep_item)
{ {
int ret; int ret;
memset(queue_item, 0, sizeof(struct db_queue_item)); memset(queue_item, 0, sizeof(struct db_queue_item));
if (!queue_enum->stmt) if (!query_params->stmt)
{ {
DPRINTF(E_LOG, L_DB, "Queue enum not started!\n"); DPRINTF(E_LOG, L_DB, "Queue enum not started!\n");
return -1; return -1;
} }
ret = db_blocking_step(queue_enum->stmt); ret = db_blocking_step(query_params->stmt);
if (ret == SQLITE_DONE) if (ret == SQLITE_DONE)
{ {
DPRINTF(E_DBG, L_DB, "End of queue enum results\n"); DPRINTF(E_DBG, L_DB, "End of queue enum results\n");
@ -4642,40 +4632,40 @@ queue_enum_fetch(struct db_queue_enum *queue_enum, struct db_queue_item *queue_i
return -1; return -1;
} }
queue_item->id = (uint32_t)sqlite3_column_int(queue_enum->stmt, 0); queue_item->id = (uint32_t)sqlite3_column_int(query_params->stmt, 0);
queue_item->file_id = (uint32_t)sqlite3_column_int(queue_enum->stmt, 1); queue_item->file_id = (uint32_t)sqlite3_column_int(query_params->stmt, 1);
queue_item->pos = (uint32_t)sqlite3_column_int(queue_enum->stmt, 2); queue_item->pos = (uint32_t)sqlite3_column_int(query_params->stmt, 2);
queue_item->shuffle_pos = (uint32_t)sqlite3_column_int(queue_enum->stmt, 3); queue_item->shuffle_pos = (uint32_t)sqlite3_column_int(query_params->stmt, 3);
queue_item->data_kind = sqlite3_column_int(queue_enum->stmt, 4); queue_item->data_kind = sqlite3_column_int(query_params->stmt, 4);
queue_item->media_kind = sqlite3_column_int(queue_enum->stmt, 5); queue_item->media_kind = sqlite3_column_int(query_params->stmt, 5);
queue_item->song_length = (uint32_t)sqlite3_column_int(queue_enum->stmt, 6); queue_item->song_length = (uint32_t)sqlite3_column_int(query_params->stmt, 6);
queue_item->path = strdup_if((char *)sqlite3_column_text(queue_enum->stmt, 7), keep_item); queue_item->path = strdup_if((char *)sqlite3_column_text(query_params->stmt, 7), keep_item);
queue_item->virtual_path = strdup_if((char *)sqlite3_column_text(queue_enum->stmt, 8), keep_item); queue_item->virtual_path = strdup_if((char *)sqlite3_column_text(query_params->stmt, 8), keep_item);
queue_item->title = strdup_if((char *)sqlite3_column_text(queue_enum->stmt, 9), keep_item); queue_item->title = strdup_if((char *)sqlite3_column_text(query_params->stmt, 9), keep_item);
queue_item->artist = strdup_if((char *)sqlite3_column_text(queue_enum->stmt, 10), keep_item); queue_item->artist = strdup_if((char *)sqlite3_column_text(query_params->stmt, 10), keep_item);
queue_item->album_artist = strdup_if((char *)sqlite3_column_text(queue_enum->stmt, 11), keep_item); queue_item->album_artist = strdup_if((char *)sqlite3_column_text(query_params->stmt, 11), keep_item);
queue_item->album = strdup_if((char *)sqlite3_column_text(queue_enum->stmt, 12), keep_item); queue_item->album = strdup_if((char *)sqlite3_column_text(query_params->stmt, 12), keep_item);
queue_item->genre = strdup_if((char *)sqlite3_column_text(queue_enum->stmt, 13), keep_item); queue_item->genre = strdup_if((char *)sqlite3_column_text(query_params->stmt, 13), keep_item);
queue_item->songalbumid = sqlite3_column_int64(queue_enum->stmt, 14); queue_item->songalbumid = sqlite3_column_int64(query_params->stmt, 14);
queue_item->time_modified = sqlite3_column_int(queue_enum->stmt, 15); queue_item->time_modified = sqlite3_column_int(query_params->stmt, 15);
queue_item->artist_sort = strdup_if((char *)sqlite3_column_text(queue_enum->stmt, 16), keep_item); queue_item->artist_sort = strdup_if((char *)sqlite3_column_text(query_params->stmt, 16), keep_item);
queue_item->album_sort = strdup_if((char *)sqlite3_column_text(queue_enum->stmt, 17), keep_item); queue_item->album_sort = strdup_if((char *)sqlite3_column_text(query_params->stmt, 17), keep_item);
queue_item->album_artist_sort = strdup_if((char *)sqlite3_column_text(queue_enum->stmt, 18), keep_item); queue_item->album_artist_sort = strdup_if((char *)sqlite3_column_text(query_params->stmt, 18), keep_item);
queue_item->year = sqlite3_column_int(queue_enum->stmt, 19); queue_item->year = sqlite3_column_int(query_params->stmt, 19);
queue_item->track = sqlite3_column_int(queue_enum->stmt, 20); queue_item->track = sqlite3_column_int(query_params->stmt, 20);
queue_item->disc = sqlite3_column_int(queue_enum->stmt, 21); queue_item->disc = sqlite3_column_int(query_params->stmt, 21);
return 0; return 0;
} }
int int
db_queue_enum_start(struct db_queue_enum *queue_enum) db_queue_enum_start(struct query_params *query_params)
{ {
int ret; int ret;
db_transaction_begin(); db_transaction_begin();
ret = queue_enum_start(queue_enum); ret = queue_enum_start(query_params);
if (ret < 0) if (ret < 0)
db_transaction_rollback(); db_transaction_rollback();
@ -4684,19 +4674,16 @@ db_queue_enum_start(struct db_queue_enum *queue_enum)
} }
void void
db_queue_enum_end(struct db_queue_enum *queue_enum) db_queue_enum_end(struct query_params *query_params)
{ {
if (!queue_enum->stmt) db_query_end(query_params);
return;
queue_enum_end(queue_enum);
db_transaction_end(); db_transaction_end();
} }
int int
db_queue_enum_fetch(struct db_queue_enum *queue_enum, struct db_queue_item *queue_item) db_queue_enum_fetch(struct query_params *query_params, struct db_queue_item *queue_item)
{ {
return queue_enum_fetch(queue_enum, queue_item, 0); return queue_enum_fetch(query_params, queue_item, 0);
} }
int int
@ -4748,21 +4735,21 @@ db_queue_get_pos_byfileid(uint32_t file_id, char shuffle)
} }
static int static int
queue_fetch_byitemid(struct db_queue_enum *queue_enum, uint32_t item_id, struct db_queue_item *queue_item, int keep_item) queue_fetch_byitemid(struct query_params *query_params, uint32_t item_id, struct db_queue_item *queue_item, int keep_item)
{ {
int ret; int ret;
memset(queue_enum, 0, sizeof(struct db_queue_enum)); memset(query_params, 0, sizeof(struct query_params));
queue_enum->filter = sqlite3_mprintf("id = %d", item_id); query_params->filter = sqlite3_mprintf("id = %d", item_id);
ret = queue_enum_start(queue_enum); ret = queue_enum_start(query_params);
if (ret < 0) if (ret < 0)
{ {
sqlite3_free(queue_enum->filter); sqlite3_free(query_params->filter);
return -1; return -1;
} }
ret = queue_enum_fetch(queue_enum, queue_item, keep_item); ret = queue_enum_fetch(query_params, queue_item, keep_item);
return ret; return ret;
} }
@ -4771,10 +4758,10 @@ struct db_queue_item *
db_queue_fetch_byitemid(uint32_t item_id) db_queue_fetch_byitemid(uint32_t item_id)
{ {
struct db_queue_item *queue_item; struct db_queue_item *queue_item;
struct db_queue_enum queue_enum; struct query_params query_params;
int ret; int ret;
memset(&queue_enum, 0, sizeof(struct db_queue_enum)); memset(&query_params, 0, sizeof(struct query_params));
queue_item = calloc(1, sizeof(struct db_queue_item)); queue_item = calloc(1, sizeof(struct db_queue_item));
if (!queue_item) if (!queue_item)
{ {
@ -4783,8 +4770,8 @@ db_queue_fetch_byitemid(uint32_t item_id)
} }
db_transaction_begin(); db_transaction_begin();
ret = queue_fetch_byitemid(&queue_enum, item_id, queue_item, 1); ret = queue_fetch_byitemid(&query_params, item_id, queue_item, 1);
queue_enum_end(&queue_enum); db_query_end(&query_params);
db_transaction_end(); db_transaction_end();
if (ret < 0) if (ret < 0)
@ -4807,10 +4794,10 @@ struct db_queue_item *
db_queue_fetch_byfileid(uint32_t file_id) db_queue_fetch_byfileid(uint32_t file_id)
{ {
struct db_queue_item *queue_item; struct db_queue_item *queue_item;
struct db_queue_enum queue_enum; struct query_params query_params;
int ret; int ret;
memset(&queue_enum, 0, sizeof(struct db_queue_enum)); memset(&query_params, 0, sizeof(struct query_params));
queue_item = calloc(1, sizeof(struct db_queue_item)); queue_item = calloc(1, sizeof(struct db_queue_item));
if (!queue_item) if (!queue_item)
{ {
@ -4820,21 +4807,21 @@ db_queue_fetch_byfileid(uint32_t file_id)
db_transaction_begin(); db_transaction_begin();
queue_enum.filter = sqlite3_mprintf("file_id = %d", file_id); query_params.filter = sqlite3_mprintf("file_id = %d", file_id);
ret = queue_enum_start(&queue_enum); ret = queue_enum_start(&query_params);
if (ret < 0) if (ret < 0)
{ {
sqlite3_free(queue_enum.filter); sqlite3_free(query_params.filter);
db_transaction_end(); db_transaction_end();
free_queue_item(queue_item, 0); free_queue_item(queue_item, 0);
DPRINTF(E_LOG, L_DB, "Error fetching queue item by file id\n"); DPRINTF(E_LOG, L_DB, "Error fetching queue item by file id\n");
return NULL; return NULL;
} }
ret = queue_enum_fetch(&queue_enum, queue_item, 1); ret = queue_enum_fetch(&query_params, queue_item, 1);
queue_enum_end(&queue_enum); db_query_end(&query_params);
sqlite3_free(queue_enum.filter); sqlite3_free(query_params.filter);
db_transaction_end(); db_transaction_end();
if (ret < 0) if (ret < 0)
@ -4854,24 +4841,24 @@ db_queue_fetch_byfileid(uint32_t file_id)
} }
static int static int
queue_fetch_bypos(struct db_queue_enum *queue_enum, uint32_t pos, char shuffle, struct db_queue_item *queue_item, int keep_item) queue_fetch_bypos(struct query_params *query_params, uint32_t pos, char shuffle, struct db_queue_item *queue_item, int keep_item)
{ {
int ret; int ret;
memset(queue_enum, 0, sizeof(struct db_queue_enum)); memset(query_params, 0, sizeof(struct query_params));
if (shuffle) if (shuffle)
queue_enum->filter = sqlite3_mprintf("shuffle_pos = %d", pos); query_params->filter = sqlite3_mprintf("shuffle_pos = %d", pos);
else else
queue_enum->filter = sqlite3_mprintf("pos = %d", pos); query_params->filter = sqlite3_mprintf("pos = %d", pos);
ret = queue_enum_start(queue_enum); ret = queue_enum_start(query_params);
if (ret < 0) if (ret < 0)
{ {
sqlite3_free(queue_enum->filter); sqlite3_free(query_params->filter);
return -1; return -1;
} }
ret = queue_enum_fetch(queue_enum, queue_item, keep_item); ret = queue_enum_fetch(query_params, queue_item, keep_item);
return ret; return ret;
} }
@ -4880,10 +4867,10 @@ struct db_queue_item *
db_queue_fetch_bypos(uint32_t pos, char shuffle) db_queue_fetch_bypos(uint32_t pos, char shuffle)
{ {
struct db_queue_item *queue_item; struct db_queue_item *queue_item;
struct db_queue_enum queue_enum; struct query_params query_params;
int ret; int ret;
memset(&queue_enum, 0, sizeof(struct db_queue_enum)); memset(&query_params, 0, sizeof(struct query_params));
queue_item = calloc(1, sizeof(struct db_queue_item)); queue_item = calloc(1, sizeof(struct db_queue_item));
if (!queue_item) if (!queue_item)
{ {
@ -4892,8 +4879,8 @@ db_queue_fetch_bypos(uint32_t pos, char shuffle)
} }
db_transaction_begin(); db_transaction_begin();
ret = queue_fetch_bypos(&queue_enum, pos, shuffle, queue_item, 1); ret = queue_fetch_bypos(&query_params, pos, shuffle, queue_item, 1);
queue_enum_end(&queue_enum); db_query_end(&query_params);
db_transaction_end(); db_transaction_end();
if (ret < 0) if (ret < 0)
@ -4913,7 +4900,7 @@ db_queue_fetch_bypos(uint32_t pos, char shuffle)
} }
static int static int
queue_fetch_byposrelativetoitem(struct db_queue_enum *queue_enum, int pos, uint32_t item_id, char shuffle, struct db_queue_item *queue_item, int keep_item) queue_fetch_byposrelativetoitem(struct query_params *query_params, int pos, uint32_t item_id, char shuffle, struct db_queue_item *queue_item, int keep_item)
{ {
int pos_absolute; int pos_absolute;
int ret; int ret;
@ -4930,7 +4917,7 @@ queue_fetch_byposrelativetoitem(struct db_queue_enum *queue_enum, int pos, uint3
pos_absolute += pos; pos_absolute += pos;
ret = queue_fetch_bypos(queue_enum, pos_absolute, shuffle, queue_item, keep_item); ret = queue_fetch_bypos(query_params, pos_absolute, shuffle, queue_item, keep_item);
DPRINTF(E_DBG, L_DB, "Fetch by pos: fetched item (id=%d, pos=%d, file-id=%d)\n", queue_item->id, queue_item->pos, queue_item->file_id); DPRINTF(E_DBG, L_DB, "Fetch by pos: fetched item (id=%d, pos=%d, file-id=%d)\n", queue_item->id, queue_item->pos, queue_item->file_id);
@ -4941,12 +4928,12 @@ struct db_queue_item *
db_queue_fetch_byposrelativetoitem(int pos, uint32_t item_id, char shuffle) db_queue_fetch_byposrelativetoitem(int pos, uint32_t item_id, char shuffle)
{ {
struct db_queue_item *queue_item; struct db_queue_item *queue_item;
struct db_queue_enum queue_enum; struct query_params query_params;
int ret; int ret;
DPRINTF(E_DBG, L_DB, "Fetch by pos: pos (%d) relative to item with id (%d)\n", pos, item_id); DPRINTF(E_DBG, L_DB, "Fetch by pos: pos (%d) relative to item with id (%d)\n", pos, item_id);
memset(&queue_enum, 0, sizeof(struct db_queue_enum)); memset(&query_params, 0, sizeof(struct query_params));
queue_item = calloc(1, sizeof(struct db_queue_item)); queue_item = calloc(1, sizeof(struct db_queue_item));
if (!queue_item) if (!queue_item)
{ {
@ -4956,8 +4943,8 @@ db_queue_fetch_byposrelativetoitem(int pos, uint32_t item_id, char shuffle)
db_transaction_begin(); db_transaction_begin();
ret = queue_fetch_byposrelativetoitem(&queue_enum, pos, item_id, shuffle, queue_item, 1); ret = queue_fetch_byposrelativetoitem(&query_params, pos, item_id, shuffle, queue_item, 1);
queue_enum_end(&queue_enum); db_query_end(&query_params);
db_transaction_end(); db_transaction_end();
@ -5002,7 +4989,7 @@ db_queue_cleanup()
#define Q_TMPL_UPDATE "UPDATE queue SET pos = %d WHERE id = %d;" #define Q_TMPL_UPDATE "UPDATE queue SET pos = %d WHERE id = %d;"
#define Q_TMPL_UPDATE_SHUFFLE "UPDATE queue SET shuffle_pos = %d WHERE id = %d;" #define Q_TMPL_UPDATE_SHUFFLE "UPDATE queue SET shuffle_pos = %d WHERE id = %d;"
struct db_queue_enum queue_enum; struct query_params query_params;
struct db_queue_item queue_item; struct db_queue_item queue_item;
char *query; char *query;
int pos; int pos;
@ -5027,9 +5014,9 @@ db_queue_cleanup()
} }
// Update position of normal queue // Update position of normal queue
memset(&queue_enum, 0, sizeof(struct db_queue_enum)); memset(&query_params, 0, sizeof(struct query_params));
ret = queue_enum_start(&queue_enum); ret = queue_enum_start(&query_params);
if (ret < 0) if (ret < 0)
{ {
db_transaction_rollback(); db_transaction_rollback();
@ -5037,7 +5024,7 @@ db_queue_cleanup()
} }
pos = 0; pos = 0;
while ((ret = queue_enum_fetch(&queue_enum, &queue_item, 0)) == 0 && (queue_item.id > 0)) while ((ret = queue_enum_fetch(&query_params, &queue_item, 0)) == 0 && (queue_item.id > 0))
{ {
if (queue_item.pos != pos) if (queue_item.pos != pos)
{ {
@ -5053,7 +5040,7 @@ db_queue_cleanup()
pos++; pos++;
} }
queue_enum_end(&queue_enum); db_query_end(&query_params);
if (ret < 0) if (ret < 0)
{ {
@ -5062,10 +5049,10 @@ db_queue_cleanup()
} }
// Update position of shuffle queue // Update position of shuffle queue
memset(&queue_enum, 0, sizeof(struct db_queue_enum)); memset(&query_params, 0, sizeof(struct query_params));
queue_enum.orderby_shufflepos = 1; query_params.sort = S_SHUFFLE_POS;
ret = queue_enum_start(&queue_enum); ret = queue_enum_start(&query_params);
if (ret < 0) if (ret < 0)
{ {
db_transaction_rollback(); db_transaction_rollback();
@ -5073,7 +5060,7 @@ db_queue_cleanup()
} }
pos = 0; pos = 0;
while ((ret = queue_enum_fetch(&queue_enum, &queue_item, 0)) == 0 && (queue_item.id > 0)) while ((ret = queue_enum_fetch(&query_params, &queue_item, 0)) == 0 && (queue_item.id > 0))
{ {
if (queue_item.shuffle_pos != pos) if (queue_item.shuffle_pos != pos)
{ {
@ -5089,7 +5076,7 @@ db_queue_cleanup()
pos++; pos++;
} }
queue_enum_end(&queue_enum); db_query_end(&query_params);
if (ret < 0) if (ret < 0)
{ {
@ -5163,33 +5150,33 @@ queue_delete_item(struct db_queue_item *queue_item)
int int
db_queue_delete_byitemid(uint32_t item_id) db_queue_delete_byitemid(uint32_t item_id)
{ {
struct db_queue_enum queue_enum; struct query_params query_params;
struct db_queue_item queue_item; struct db_queue_item queue_item;
int ret; int ret;
memset(&queue_enum, 0, sizeof(struct db_queue_enum)); memset(&query_params, 0, sizeof(struct query_params));
db_transaction_begin(); db_transaction_begin();
ret = queue_fetch_byitemid(&queue_enum, item_id, &queue_item, 0); ret = queue_fetch_byitemid(&query_params, item_id, &queue_item, 0);
if (ret < 0) if (ret < 0)
{ {
queue_enum_end(&queue_enum); db_query_end(&query_params);
db_transaction_rollback(); db_transaction_rollback();
return -1; return -1;
} }
if (queue_item.id == 0) if (queue_item.id == 0)
{ {
queue_enum_end(&queue_enum); db_query_end(&query_params);
db_transaction_end(); db_transaction_end();
return 0; return 0;
} }
ret = queue_delete_item(&queue_item); ret = queue_delete_item(&queue_item);
queue_enum_end(&queue_enum); db_query_end(&query_params);
if (ret < 0) if (ret < 0)
{ {
@ -5207,26 +5194,26 @@ db_queue_delete_byitemid(uint32_t item_id)
int int
db_queue_delete_bypos(uint32_t pos, int count) db_queue_delete_bypos(uint32_t pos, int count)
{ {
struct db_queue_enum queue_enum; struct query_params query_params;
struct db_queue_item queue_item; struct db_queue_item queue_item;
int to_pos; int to_pos;
int ret; int ret;
// Find items with the given position // Find items with the given position
memset(&queue_enum, 0, sizeof(struct db_queue_enum)); memset(&query_params, 0, sizeof(struct query_params));
to_pos = pos + count; to_pos = pos + count;
queue_enum.filter = sqlite3_mprintf("pos => %d AND pos < %d", pos, to_pos); query_params.filter = sqlite3_mprintf("pos => %d AND pos < %d", pos, to_pos);
db_transaction_begin(); db_transaction_begin();
ret = queue_enum_start(&queue_enum); ret = queue_enum_start(&query_params);
if (ret < 0) if (ret < 0)
{ {
return -1; return -1;
} }
while ((ret = queue_enum_fetch(&queue_enum, &queue_item, 0)) == 0 && (queue_item.id > 0)) while ((ret = queue_enum_fetch(&query_params, &queue_item, 0)) == 0 && (queue_item.id > 0))
{ {
ret = queue_delete_item(&queue_item); ret = queue_delete_item(&queue_item);
if (ret < 0) if (ret < 0)
@ -5236,7 +5223,7 @@ db_queue_delete_bypos(uint32_t pos, int count)
} }
} }
queue_enum_end(&queue_enum); db_query_end(&query_params);
if (ret < 0) if (ret < 0)
{ {
@ -5254,32 +5241,32 @@ db_queue_delete_bypos(uint32_t pos, int count)
int int
db_queue_delete_byposrelativetoitem(uint32_t pos, uint32_t item_id, char shuffle) db_queue_delete_byposrelativetoitem(uint32_t pos, uint32_t item_id, char shuffle)
{ {
struct db_queue_enum queue_enum; struct query_params query_params;
struct db_queue_item queue_item; struct db_queue_item queue_item;
int ret; int ret;
memset(&queue_enum, 0, sizeof(struct db_queue_enum)); memset(&query_params, 0, sizeof(struct query_params));
db_transaction_begin(); db_transaction_begin();
ret = queue_fetch_byposrelativetoitem(&queue_enum, pos, item_id, shuffle, &queue_item, 0); ret = queue_fetch_byposrelativetoitem(&query_params, pos, item_id, shuffle, &queue_item, 0);
if (ret < 0) if (ret < 0)
{ {
queue_enum_end(&queue_enum); db_query_end(&query_params);
db_transaction_rollback(); db_transaction_rollback();
return -1; return -1;
} }
else if (queue_item.id == 0) else if (queue_item.id == 0)
{ {
// No item found // No item found
queue_enum_end(&queue_enum); db_query_end(&query_params);
db_transaction_end(); db_transaction_end();
return 0; return 0;
} }
ret = queue_delete_item(&queue_item); ret = queue_delete_item(&queue_item);
queue_enum_end(&queue_enum); db_query_end(&query_params);
if (ret < 0) if (ret < 0)
{ {
@ -5362,26 +5349,26 @@ int
db_queue_move_bypos(int pos_from, int pos_to) db_queue_move_bypos(int pos_from, int pos_to)
{ {
struct db_queue_item queue_item; struct db_queue_item queue_item;
struct db_queue_enum queue_enum; struct query_params query_params;
char *query; char *query;
int ret; int ret;
memset(&queue_enum, 0, sizeof(struct db_queue_enum)); memset(&query_params, 0, sizeof(struct query_params));
db_transaction_begin(); db_transaction_begin();
// Find item to move // Find item to move
ret = queue_fetch_bypos(&queue_enum, pos_from, 0, &queue_item, 0); ret = queue_fetch_bypos(&query_params, pos_from, 0, &queue_item, 0);
if (ret < 0) if (ret < 0)
{ {
queue_enum_end(&queue_enum); db_query_end(&query_params);
db_transaction_rollback(); db_transaction_rollback();
return -1; return -1;
} }
if (queue_item.id == 0) if (queue_item.id == 0)
{ {
queue_enum_end(&queue_enum); db_query_end(&query_params);
db_transaction_end(); db_transaction_end();
return 0; return 0;
} }
@ -5391,7 +5378,7 @@ db_queue_move_bypos(int pos_from, int pos_to)
ret = db_query_run(query, 1, 0); ret = db_query_run(query, 1, 0);
if (ret < 0) if (ret < 0)
{ {
queue_enum_end(&queue_enum); db_query_end(&query_params);
db_transaction_rollback(); db_transaction_rollback();
return -1; return -1;
} }
@ -5401,7 +5388,7 @@ db_queue_move_bypos(int pos_from, int pos_to)
ret = db_query_run(query, 1, 0); ret = db_query_run(query, 1, 0);
if (ret < 0) if (ret < 0)
{ {
queue_enum_end(&queue_enum); db_query_end(&query_params);
db_transaction_rollback(); db_transaction_rollback();
return -1; return -1;
} }
@ -5411,12 +5398,12 @@ db_queue_move_bypos(int pos_from, int pos_to)
ret = db_query_run(query, 1, 0); ret = db_query_run(query, 1, 0);
if (ret < 0) if (ret < 0)
{ {
queue_enum_end(&queue_enum); db_query_end(&query_params);
db_transaction_rollback(); db_transaction_rollback();
return -1; return -1;
} }
queue_enum_end(&queue_enum); db_query_end(&query_params);
db_transaction_end(); db_transaction_end();
queue_inc_version_and_notify(); queue_inc_version_and_notify();
@ -5435,24 +5422,24 @@ db_queue_move_bypos(int pos_from, int pos_to)
int int
db_queue_move_byposrelativetoitem(uint32_t from_pos, uint32_t to_offset, uint32_t item_id, char shuffle) db_queue_move_byposrelativetoitem(uint32_t from_pos, uint32_t to_offset, uint32_t item_id, char shuffle)
{ {
struct db_queue_enum queue_enum; struct query_params query_params;
struct db_queue_item queue_item; struct db_queue_item queue_item;
char *query; char *query;
int pos_move_from; int pos_move_from;
int pos_move_to; int pos_move_to;
int ret; int ret;
memset(&queue_enum, 0, sizeof(struct db_queue_enum)); memset(&query_params, 0, sizeof(struct query_params));
db_transaction_begin(); db_transaction_begin();
DPRINTF(E_DBG, L_DB, "Move by pos: from %d offset %d relative to item (%d)\n", from_pos, to_offset, item_id); DPRINTF(E_DBG, L_DB, "Move by pos: from %d offset %d relative to item (%d)\n", from_pos, to_offset, item_id);
// Find item with the given item_id // Find item with the given item_id
ret = queue_fetch_byitemid(&queue_enum, item_id, &queue_item, 0); ret = queue_fetch_byitemid(&query_params, item_id, &queue_item, 0);
if (ret < 0) if (ret < 0)
{ {
queue_enum_end(&queue_enum); db_query_end(&query_params);
db_transaction_rollback(); db_transaction_rollback();
return -1; return -1;
} }
@ -5461,7 +5448,7 @@ db_queue_move_byposrelativetoitem(uint32_t from_pos, uint32_t to_offset, uint32_
if (queue_item.id == 0) if (queue_item.id == 0)
{ {
queue_enum_end(&queue_enum); db_query_end(&query_params);
db_transaction_end(); db_transaction_end();
return 0; return 0;
} }
@ -5486,15 +5473,15 @@ db_queue_move_byposrelativetoitem(uint32_t from_pos, uint32_t to_offset, uint32_
pos_move_to++; pos_move_to++;
} }
queue_enum_end(&queue_enum); db_query_end(&query_params);
DPRINTF(E_DBG, L_DB, "Move by pos: absolute pos: move from %d to %d\n", pos_move_from, pos_move_to); DPRINTF(E_DBG, L_DB, "Move by pos: absolute pos: move from %d to %d\n", pos_move_from, pos_move_to);
// Find item to move // Find item to move
ret = queue_fetch_bypos(&queue_enum, pos_move_from, shuffle, &queue_item, 0); ret = queue_fetch_bypos(&query_params, pos_move_from, shuffle, &queue_item, 0);
if (ret < 0) if (ret < 0)
{ {
queue_enum_end(&queue_enum); db_query_end(&query_params);
db_transaction_rollback(); db_transaction_rollback();
return -1; return -1;
} }
@ -5503,7 +5490,7 @@ db_queue_move_byposrelativetoitem(uint32_t from_pos, uint32_t to_offset, uint32_
if (queue_item.id == 0) if (queue_item.id == 0)
{ {
queue_enum_end(&queue_enum); db_query_end(&query_params);
db_transaction_end(); db_transaction_end();
return 0; return 0;
} }
@ -5517,7 +5504,7 @@ db_queue_move_byposrelativetoitem(uint32_t from_pos, uint32_t to_offset, uint32_
ret = db_query_run(query, 1, 0); ret = db_query_run(query, 1, 0);
if (ret < 0) if (ret < 0)
{ {
queue_enum_end(&queue_enum); db_query_end(&query_params);
db_transaction_rollback(); db_transaction_rollback();
return -1; return -1;
} }
@ -5531,7 +5518,7 @@ db_queue_move_byposrelativetoitem(uint32_t from_pos, uint32_t to_offset, uint32_
ret = db_query_run(query, 1, 0); ret = db_query_run(query, 1, 0);
if (ret < 0) if (ret < 0)
{ {
queue_enum_end(&queue_enum); db_query_end(&query_params);
db_transaction_rollback(); db_transaction_rollback();
return -1; return -1;
} }
@ -5545,12 +5532,12 @@ db_queue_move_byposrelativetoitem(uint32_t from_pos, uint32_t to_offset, uint32_
ret = db_query_run(query, 1, 0); ret = db_query_run(query, 1, 0);
if (ret < 0) if (ret < 0)
{ {
queue_enum_end(&queue_enum); db_query_end(&query_params);
db_transaction_rollback(); db_transaction_rollback();
return -1; return -1;
} }
queue_enum_end(&queue_enum); db_query_end(&query_params);
db_transaction_end(); db_transaction_end();
queue_inc_version_and_notify(); queue_inc_version_and_notify();
@ -5576,7 +5563,7 @@ db_queue_reshuffle(uint32_t item_id)
int *shuffle_pos; int *shuffle_pos;
int len; int len;
int i; int i;
struct db_queue_enum queue_enum; struct query_params query_params;
int ret; int ret;
db_transaction_begin(); db_transaction_begin();
@ -5620,19 +5607,19 @@ db_queue_reshuffle(uint32_t item_id)
memset(&queue_enum, 0, sizeof(struct db_queue_enum)); memset(&query_params, 0, sizeof(struct query_params));
queue_enum.filter = sqlite3_mprintf("pos >= %d", pos); query_params.filter = sqlite3_mprintf("pos >= %d", pos);
ret = queue_enum_start(&queue_enum); ret = queue_enum_start(&query_params);
if (ret < 0) if (ret < 0)
{ {
sqlite3_free(queue_enum.filter); sqlite3_free(query_params.filter);
db_transaction_rollback(); db_transaction_rollback();
return -1; return -1;
} }
i = 0; i = 0;
while ((ret = queue_enum_fetch(&queue_enum, &queue_item, 0)) == 0 && (queue_item.id > 0) && (i < len)) while ((ret = queue_enum_fetch(&query_params, &queue_item, 0)) == 0 && (queue_item.id > 0) && (i < len))
{ {
query = sqlite3_mprintf("UPDATE queue SET shuffle_pos = %d where id = %d;", shuffle_pos[i], queue_item.id); query = sqlite3_mprintf("UPDATE queue SET shuffle_pos = %d where id = %d;", shuffle_pos[i], queue_item.id);
ret = db_query_run(query, 1, 0); ret = db_query_run(query, 1, 0);
@ -5645,7 +5632,7 @@ db_queue_reshuffle(uint32_t item_id)
i++; i++;
} }
queue_enum_end(&queue_enum); db_query_end(&query_params);
if (ret < 0) if (ret < 0)
{ {

View File

@ -28,6 +28,8 @@ enum sort_type {
S_DISC, S_DISC,
S_TRACK, S_TRACK,
S_VPATH, S_VPATH,
S_POS,
S_SHUFFLE_POS,
}; };
#define Q_F_BROWSE (1 << 15) #define Q_F_BROWSE (1 << 15)
@ -417,17 +419,6 @@ struct db_queue_item
uint32_t disc; uint32_t disc;
}; };
struct db_queue_enum
{
/* 0 = ordered by position, 1 = ordered by position in shuffle queue */
int orderby_shufflepos;
char *filter;
/* Private enum context, keep out */
sqlite3_stmt *stmt;
};
char * char *
db_escape_string(const char *str); db_escape_string(const char *str);
@ -726,13 +717,13 @@ int
db_queue_add_by_fileid(int id, char reshuffle, uint32_t item_id); db_queue_add_by_fileid(int id, char reshuffle, uint32_t item_id);
int int
db_queue_enum_start(struct db_queue_enum *queue_enum); db_queue_enum_start(struct query_params *query_params);
void void
db_queue_enum_end(struct db_queue_enum *queue_enum); db_queue_enum_end(struct query_params *query_params);
int int
db_queue_enum_fetch(struct db_queue_enum *queue_enum, struct db_queue_item *queue_item); db_queue_enum_fetch(struct query_params *query_params, struct db_queue_item *queue_item);
struct db_queue_item * struct db_queue_item *
db_queue_fetch_byitemid(uint32_t item_id); db_queue_fetch_byitemid(uint32_t item_id);

View File

@ -1568,7 +1568,7 @@ dacp_reply_playqueuecontents(struct evhttp_request *req, struct evbuffer *evbuf,
int count; int count;
int ret; int ret;
int start_index; int start_index;
struct db_queue_enum queue_enum; struct query_params query_params;
struct db_queue_item queue_item; struct db_queue_item queue_item;
/* /ctrl-int/1/playqueue-contents?span=50&session-id=... */ /* /ctrl-int/1/playqueue-contents?span=50&session-id=... */
@ -1629,13 +1629,13 @@ dacp_reply_playqueuecontents(struct evhttp_request *req, struct evbuffer *evbuf,
{ {
player_get_status(&status); player_get_status(&status);
memset(&queue_enum, 0, sizeof(struct db_queue_enum)); memset(&query_params, 0, sizeof(struct query_params));
if (status.shuffle) if (status.shuffle)
queue_enum.orderby_shufflepos = 1; query_params.sort = S_SHUFFLE_POS;
ret = db_queue_enum_start(&queue_enum); ret = db_queue_enum_start(&query_params);
count = 0; //FIXME [queue] Check count value count = 0; //FIXME [queue] Check count value
while ((ret = db_queue_enum_fetch(&queue_enum, &queue_item)) == 0 && queue_item.id > 0) while ((ret = db_queue_enum_fetch(&query_params, &queue_item)) == 0 && queue_item.id > 0)
{ {
if (status.item_id == 0 || status.item_id == queue_item.id) if (status.item_id == 0 || status.item_id == queue_item.id)
count = 1; count = 1;
@ -1654,8 +1654,8 @@ dacp_reply_playqueuecontents(struct evhttp_request *req, struct evbuffer *evbuf,
} }
} }
db_queue_enum_end(&queue_enum); db_queue_enum_end(&query_params);
sqlite3_free(queue_enum.filter); sqlite3_free(query_params.filter);
} }
/* Playlists are hist, curr and main. */ /* Playlists are hist, curr and main. */

View File

@ -1794,7 +1794,7 @@ mpd_command_moveid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
static int static int
mpd_command_playlistid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg) mpd_command_playlistid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
{ {
struct db_queue_enum queue_enum; struct query_params query_params;
struct db_queue_item queue_item; struct db_queue_item queue_item;
uint32_t songid; uint32_t songid;
int ret; int ret;
@ -1813,22 +1813,22 @@ mpd_command_playlistid(struct evbuffer *evbuf, int argc, char **argv, char **err
} }
} }
memset(&queue_enum, 0, sizeof(struct db_queue_enum)); memset(&query_params, 0, sizeof(struct query_params));
if (songid > 0) if (songid > 0)
queue_enum.filter = sqlite3_mprintf("id = %d", songid); query_params.filter = sqlite3_mprintf("id = %d", songid);
ret = db_queue_enum_start(&queue_enum); ret = db_queue_enum_start(&query_params);
if (ret < 0) if (ret < 0)
{ {
sqlite3_free(queue_enum.filter); sqlite3_free(query_params.filter);
ret = asprintf(errmsg, "Failed to start queue enum for command playlistid: '%s'", argv[1]); ret = asprintf(errmsg, "Failed to start queue enum for command playlistid: '%s'", argv[1]);
if (ret < 0) if (ret < 0)
DPRINTF(E_LOG, L_MPD, "Out of memory\n"); DPRINTF(E_LOG, L_MPD, "Out of memory\n");
return ACK_ERROR_ARG; return ACK_ERROR_ARG;
} }
while ((ret = db_queue_enum_fetch(&queue_enum, &queue_item)) == 0 && queue_item.id > 0) while ((ret = db_queue_enum_fetch(&query_params, &queue_item)) == 0 && queue_item.id > 0)
{ {
ret = mpd_add_db_queue_item(evbuf, &queue_item); ret = mpd_add_db_queue_item(evbuf, &queue_item);
if (ret < 0) if (ret < 0)
@ -1837,14 +1837,14 @@ mpd_command_playlistid(struct evbuffer *evbuf, int argc, char **argv, char **err
if (ret < 0) if (ret < 0)
DPRINTF(E_LOG, L_MPD, "Out of memory\n"); DPRINTF(E_LOG, L_MPD, "Out of memory\n");
db_queue_enum_end(&queue_enum); db_queue_enum_end(&query_params);
sqlite3_free(queue_enum.filter); sqlite3_free(query_params.filter);
return ACK_ERROR_UNKNOWN; return ACK_ERROR_UNKNOWN;
} }
} }
db_queue_enum_end(&queue_enum); db_queue_enum_end(&query_params);
sqlite3_free(queue_enum.filter); sqlite3_free(query_params.filter);
return 0; return 0;
} }
@ -1860,7 +1860,7 @@ mpd_command_playlistid(struct evbuffer *evbuf, int argc, char **argv, char **err
static int static int
mpd_command_playlistinfo(struct evbuffer *evbuf, int argc, char **argv, char **errmsg) mpd_command_playlistinfo(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
{ {
struct db_queue_enum queue_enum; struct query_params query_params;
struct db_queue_item queue_item; struct db_queue_item queue_item;
int start_pos; int start_pos;
int end_pos; int end_pos;
@ -1868,7 +1868,7 @@ mpd_command_playlistinfo(struct evbuffer *evbuf, int argc, char **argv, char **e
start_pos = 0; start_pos = 0;
end_pos = 0; end_pos = 0;
memset(&queue_enum, 0, sizeof(struct db_queue_enum)); memset(&query_params, 0, sizeof(struct query_params));
if (argc > 1) if (argc > 1)
{ {
@ -1884,20 +1884,20 @@ mpd_command_playlistinfo(struct evbuffer *evbuf, int argc, char **argv, char **e
if (start_pos < 0) if (start_pos < 0)
DPRINTF(E_DBG, L_MPD, "Command 'playlistinfo' called with pos < 0 (arg = '%s'), ignore arguments and return whole queue\n", argv[1]); DPRINTF(E_DBG, L_MPD, "Command 'playlistinfo' called with pos < 0 (arg = '%s'), ignore arguments and return whole queue\n", argv[1]);
else else
queue_enum.filter = sqlite3_mprintf("pos >= %d AND pos < %d", start_pos, end_pos); query_params.filter = sqlite3_mprintf("pos >= %d AND pos < %d", start_pos, end_pos);
} }
ret = db_queue_enum_start(&queue_enum); ret = db_queue_enum_start(&query_params);
if (ret < 0) if (ret < 0)
{ {
sqlite3_free(queue_enum.filter); sqlite3_free(query_params.filter);
ret = asprintf(errmsg, "Failed to start queue enum for command playlistinfo: '%s'", argv[1]); ret = asprintf(errmsg, "Failed to start queue enum for command playlistinfo: '%s'", argv[1]);
if (ret < 0) if (ret < 0)
DPRINTF(E_LOG, L_MPD, "Out of memory\n"); DPRINTF(E_LOG, L_MPD, "Out of memory\n");
return ACK_ERROR_ARG; return ACK_ERROR_ARG;
} }
while ((ret = db_queue_enum_fetch(&queue_enum, &queue_item)) == 0 && queue_item.id > 0) while ((ret = db_queue_enum_fetch(&query_params, &queue_item)) == 0 && queue_item.id > 0)
{ {
ret = mpd_add_db_queue_item(evbuf, &queue_item); ret = mpd_add_db_queue_item(evbuf, &queue_item);
if (ret < 0) if (ret < 0)
@ -1907,14 +1907,14 @@ mpd_command_playlistinfo(struct evbuffer *evbuf, int argc, char **argv, char **e
if (ret < 0) if (ret < 0)
DPRINTF(E_LOG, L_MPD, "Out of memory\n"); DPRINTF(E_LOG, L_MPD, "Out of memory\n");
db_queue_enum_end(&queue_enum); db_queue_enum_end(&query_params);
sqlite3_free(queue_enum.filter); sqlite3_free(query_params.filter);
return ACK_ERROR_UNKNOWN; return ACK_ERROR_UNKNOWN;
} }
} }
db_queue_enum_end(&queue_enum); db_queue_enum_end(&query_params);
sqlite3_free(queue_enum.filter); sqlite3_free(query_params.filter);
return 0; return 0;
} }
@ -1926,7 +1926,7 @@ mpd_command_playlistinfo(struct evbuffer *evbuf, int argc, char **argv, char **e
static int static int
mpd_command_plchanges(struct evbuffer *evbuf, int argc, char **argv, char **errmsg) mpd_command_plchanges(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
{ {
struct db_queue_enum queue_enum; struct query_params query_params;
struct db_queue_item queue_item; struct db_queue_item queue_item;
int ret; int ret;
@ -1934,9 +1934,9 @@ mpd_command_plchanges(struct evbuffer *evbuf, int argc, char **argv, char **errm
* forked-daapd does not keep track of changes in the queue based on the playlist version, * forked-daapd does not keep track of changes in the queue based on the playlist version,
* therefor plchanges returns all songs in the queue as changed ignoring the given version. * therefor plchanges returns all songs in the queue as changed ignoring the given version.
*/ */
memset(&queue_enum, 0, sizeof(struct db_queue_enum)); memset(&query_params, 0, sizeof(struct query_params));
ret = db_queue_enum_start(&queue_enum); ret = db_queue_enum_start(&query_params);
if (ret < 0) if (ret < 0)
{ {
ret = asprintf(errmsg, "Failed to start queue enum for command plchanges"); ret = asprintf(errmsg, "Failed to start queue enum for command plchanges");
@ -1945,7 +1945,7 @@ mpd_command_plchanges(struct evbuffer *evbuf, int argc, char **argv, char **errm
return ACK_ERROR_ARG; return ACK_ERROR_ARG;
} }
while ((ret = db_queue_enum_fetch(&queue_enum, &queue_item)) == 0 && queue_item.id > 0) while ((ret = db_queue_enum_fetch(&query_params, &queue_item)) == 0 && queue_item.id > 0)
{ {
ret = mpd_add_db_queue_item(evbuf, &queue_item); ret = mpd_add_db_queue_item(evbuf, &queue_item);
if (ret < 0) if (ret < 0)
@ -1955,12 +1955,12 @@ mpd_command_plchanges(struct evbuffer *evbuf, int argc, char **argv, char **errm
if (ret < 0) if (ret < 0)
DPRINTF(E_LOG, L_MPD, "Out of memory\n"); DPRINTF(E_LOG, L_MPD, "Out of memory\n");
db_queue_enum_end(&queue_enum); db_queue_enum_end(&query_params);
return ACK_ERROR_UNKNOWN; return ACK_ERROR_UNKNOWN;
} }
} }
db_queue_enum_end(&queue_enum); db_queue_enum_end(&query_params);
return 0; return 0;
} }
@ -1972,7 +1972,7 @@ mpd_command_plchanges(struct evbuffer *evbuf, int argc, char **argv, char **errm
static int static int
mpd_command_plchangesposid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg) mpd_command_plchangesposid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
{ {
struct db_queue_enum queue_enum; struct query_params query_params;
struct db_queue_item queue_item; struct db_queue_item queue_item;
int ret; int ret;
@ -1980,9 +1980,9 @@ mpd_command_plchangesposid(struct evbuffer *evbuf, int argc, char **argv, char *
* forked-daapd does not keep track of changes in the queue based on the playlist version, * forked-daapd does not keep track of changes in the queue based on the playlist version,
* therefor plchangesposid returns all songs in the queue as changed ignoring the given version. * therefor plchangesposid returns all songs in the queue as changed ignoring the given version.
*/ */
memset(&queue_enum, 0, sizeof(struct db_queue_enum)); memset(&query_params, 0, sizeof(struct query_params));
ret = db_queue_enum_start(&queue_enum); ret = db_queue_enum_start(&query_params);
if (ret < 0) if (ret < 0)
{ {
ret = asprintf(errmsg, "Failed to start queue enum for command plchangesposid"); ret = asprintf(errmsg, "Failed to start queue enum for command plchangesposid");
@ -1991,7 +1991,7 @@ mpd_command_plchangesposid(struct evbuffer *evbuf, int argc, char **argv, char *
return ACK_ERROR_ARG; return ACK_ERROR_ARG;
} }
while ((ret = db_queue_enum_fetch(&queue_enum, &queue_item)) == 0 && queue_item.id > 0) while ((ret = db_queue_enum_fetch(&query_params, &queue_item)) == 0 && queue_item.id > 0)
{ {
evbuffer_add_printf(evbuf, evbuffer_add_printf(evbuf,
"cpos: %d\n" "cpos: %d\n"
@ -2000,7 +2000,7 @@ mpd_command_plchangesposid(struct evbuffer *evbuf, int argc, char **argv, char *
queue_item.id); queue_item.id);
} }
db_queue_enum_end(&queue_enum); db_queue_enum_end(&query_params);
return 0; return 0;
} }