mirror of
https://github.com/owntone/owntone-server.git
synced 2024-12-27 15:45:56 -05:00
Add groups queries
This commit is contained in:
parent
641e5462cc
commit
b0e10fb97d
169
src/db.c
169
src/db.c
@ -755,6 +755,114 @@ db_build_query_groups(struct query_params *qp, char **q)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
db_build_query_groupitems(struct query_params *qp, char **q)
|
||||||
|
{
|
||||||
|
char *query;
|
||||||
|
char *count;
|
||||||
|
enum group_type gt;
|
||||||
|
|
||||||
|
gt = db_group_type_byid(qp->id);
|
||||||
|
|
||||||
|
switch (gt)
|
||||||
|
{
|
||||||
|
case G_ALBUMS:
|
||||||
|
count = sqlite3_mprintf("SELECT COUNT(*) FROM files JOIN groups ON files.songalbumid = groups.persistentid"
|
||||||
|
" WHERE groups.id = %d AND files.disabled = 0;", qp->id);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
DPRINTF(E_LOG, L_DB, "Unsupported group type %d for group id %d\n", gt, qp->id);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!count)
|
||||||
|
{
|
||||||
|
DPRINTF(E_LOG, L_DB, "Out of memory for count query string\n");
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
qp->results = db_get_count(count);
|
||||||
|
sqlite3_free(count);
|
||||||
|
|
||||||
|
if (qp->results < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
switch (gt)
|
||||||
|
{
|
||||||
|
case G_ALBUMS:
|
||||||
|
query = sqlite3_mprintf("SELECT files.* FROM files JOIN groups ON files.songalbumid = groups.persistentid"
|
||||||
|
" WHERE groups.id = %d AND files.disabled = 0;", qp->id);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!query)
|
||||||
|
{
|
||||||
|
DPRINTF(E_LOG, L_DB, "Out of memory for query string\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
*q = query;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
db_build_query_group_dirs(struct query_params *qp, char **q)
|
||||||
|
{
|
||||||
|
char *query;
|
||||||
|
char *count;
|
||||||
|
enum group_type gt;
|
||||||
|
|
||||||
|
gt = db_group_type_byid(qp->id);
|
||||||
|
|
||||||
|
switch (gt)
|
||||||
|
{
|
||||||
|
case G_ALBUMS:
|
||||||
|
count = sqlite3_mprintf("SELECT COUNT(DISTINCT(SUBSTR(files.path, 1, LENGTH(files.path) - LENGTH(files.fname) - 1)))"
|
||||||
|
" FROM files JOIN groups ON files.songalbumid = groups.persistentid"
|
||||||
|
" WHERE groups.id = %d AND files.disabled = 0;", qp->id);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
DPRINTF(E_LOG, L_DB, "Unsupported group type %d for group id %d\n", gt, qp->id);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!count)
|
||||||
|
{
|
||||||
|
DPRINTF(E_LOG, L_DB, "Out of memory for count query string\n");
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
qp->results = db_get_count(count);
|
||||||
|
sqlite3_free(count);
|
||||||
|
|
||||||
|
if (qp->results < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
switch (gt)
|
||||||
|
{
|
||||||
|
case G_ALBUMS:
|
||||||
|
query = sqlite3_mprintf("SELECT DISTINCT(SUBSTR(files.path, 1, LENGTH(files.path) - LENGTH(files.fname) - 1))"
|
||||||
|
" FROM files JOIN groups ON files.songalbumid = groups.persistentid"
|
||||||
|
" WHERE groups.id = %d AND files.disabled = 0;", qp->id);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!query)
|
||||||
|
{
|
||||||
|
DPRINTF(E_LOG, L_DB, "Out of memory for query string\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
*q = query;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
db_build_query_browse(struct query_params *qp, char *field, char **q)
|
db_build_query_browse(struct query_params *qp, char *field, char **q)
|
||||||
{
|
{
|
||||||
@ -838,6 +946,14 @@ db_query_start(struct query_params *qp)
|
|||||||
ret = db_build_query_groups(qp, &query);
|
ret = db_build_query_groups(qp, &query);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case Q_GROUPITEMS:
|
||||||
|
ret = db_build_query_groupitems(qp, &query);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Q_GROUP_DIRS:
|
||||||
|
ret = db_build_query_group_dirs(qp, &query);
|
||||||
|
break;
|
||||||
|
|
||||||
case Q_BROWSE_ALBUMS:
|
case Q_BROWSE_ALBUMS:
|
||||||
ret = db_build_query_browse(qp, "album", &query);
|
ret = db_build_query_browse(qp, "album", &query);
|
||||||
break;
|
break;
|
||||||
@ -906,9 +1022,9 @@ db_query_fetch_file(struct query_params *qp, struct db_media_file_info *dbmfi)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((qp->type != Q_ITEMS) && (qp->type != Q_PLITEMS))
|
if ((qp->type != Q_ITEMS) && (qp->type != Q_PLITEMS) && (qp->type != Q_GROUPITEMS))
|
||||||
{
|
{
|
||||||
DPRINTF(E_LOG, L_DB, "Not an items or playlist items query!\n");
|
DPRINTF(E_LOG, L_DB, "Not an items, playlist or group items query!\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2524,6 +2640,55 @@ db_groups_clear(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum group_type
|
||||||
|
db_group_type_byid(int id)
|
||||||
|
{
|
||||||
|
#define Q_TMPL "SELECT type FROM groups WHERE id = '%d';"
|
||||||
|
char *query;
|
||||||
|
sqlite3_stmt *stmt;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
query = sqlite3_mprintf(Q_TMPL, id);
|
||||||
|
if (!query)
|
||||||
|
{
|
||||||
|
DPRINTF(E_LOG, L_DB, "Out of memory for query string\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
DPRINTF(E_DBG, L_DB, "Running query '%s'\n", query);
|
||||||
|
|
||||||
|
ret = sqlite3_prepare_v2(hdl, query, strlen(query) + 1, &stmt, NULL);
|
||||||
|
if (ret != SQLITE_OK)
|
||||||
|
{
|
||||||
|
DPRINTF(E_LOG, L_DB, "Could not prepare statement: %s\n", sqlite3_errmsg(hdl));
|
||||||
|
|
||||||
|
sqlite3_free(query);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = sqlite3_step(stmt);
|
||||||
|
if (ret != SQLITE_ROW)
|
||||||
|
{
|
||||||
|
if (ret == SQLITE_DONE)
|
||||||
|
DPRINTF(E_INFO, L_DB, "No results\n");
|
||||||
|
else
|
||||||
|
DPRINTF(E_LOG, L_DB, "Could not step: %s\n", sqlite3_errmsg(hdl));
|
||||||
|
|
||||||
|
sqlite3_finalize(stmt);
|
||||||
|
sqlite3_free(query);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = sqlite3_column_int(stmt, 0);
|
||||||
|
|
||||||
|
sqlite3_finalize(stmt);
|
||||||
|
sqlite3_free(query);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
#undef Q_TMPL
|
||||||
|
}
|
||||||
|
|
||||||
/* Remotes */
|
/* Remotes */
|
||||||
static int
|
static int
|
||||||
|
5
src/db.h
5
src/db.h
@ -27,6 +27,8 @@ enum query_type {
|
|||||||
Q_BROWSE_GENRES = Q_F_BROWSE | (1 << 5),
|
Q_BROWSE_GENRES = Q_F_BROWSE | (1 << 5),
|
||||||
Q_BROWSE_COMPOSERS = Q_F_BROWSE | (1 << 6),
|
Q_BROWSE_COMPOSERS = Q_F_BROWSE | (1 << 6),
|
||||||
Q_GROUPS = (1 << 7),
|
Q_GROUPS = (1 << 7),
|
||||||
|
Q_GROUPITEMS = (1 << 8),
|
||||||
|
Q_GROUP_DIRS = Q_F_BROWSE | (1 << 9),
|
||||||
};
|
};
|
||||||
|
|
||||||
struct query_params {
|
struct query_params {
|
||||||
@ -381,6 +383,9 @@ db_pl_enable_bycookie(uint32_t cookie, char *path);
|
|||||||
int
|
int
|
||||||
db_groups_clear(void);
|
db_groups_clear(void);
|
||||||
|
|
||||||
|
enum group_type
|
||||||
|
db_group_type_byid(int id);
|
||||||
|
|
||||||
/* Remotes */
|
/* Remotes */
|
||||||
int
|
int
|
||||||
db_pairing_add(struct pairing_info *pi);
|
db_pairing_add(struct pairing_info *pi);
|
||||||
|
Loading…
Reference in New Issue
Block a user