From 65fb7404142a7496a0558de2c60aad50dd4207e6 Mon Sep 17 00:00:00 2001 From: Justin Maggard Date: Tue, 4 Feb 2014 12:03:57 -0800 Subject: [PATCH] upnpsoap: Support searches specifying @parentid = 0. --- upnpsoap.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/upnpsoap.c b/upnpsoap.c index df5e49f..374a3ab 100644 --- a/upnpsoap.c +++ b/upnpsoap.c @@ -1312,7 +1312,7 @@ charcat(struct string_s *str, char c) } static inline char * -parse_search_criteria(const char *str) +parse_search_criteria(const char *str, char *sep) { struct string_s criteria; int len; @@ -1448,6 +1448,7 @@ parse_search_criteria(const char *str) { strcatf(&criteria, "PARENT_ID"); s += 9; + strcpy(sep, "*"); continue; } else @@ -1585,7 +1586,7 @@ SearchContentDirectory(struct upnphttp * h, const char * action) int totalMatches; int ret; char *ContainerID, *Filter, *SearchCriteria, *SortCriteria; - char *orderBy = NULL, *where = NULL; + char *orderBy = NULL, *where = NULL, sep[] = "$*"; char groupBy[] = "group by DETAIL_ID"; struct NameValueParserData data; int RequestedCount = 0; @@ -1659,23 +1660,22 @@ SearchContentDirectory(struct upnphttp * h, const char * action) SearchCriteria, Filter, SortCriteria); if( strcmp(ContainerID, "0") == 0 ) - *ContainerID = '*'; - else if( strcmp(ContainerID, MUSIC_ALL_ID) == 0 ) + ContainerID[0] = '*'; + + if( strcmp(ContainerID, MUSIC_ALL_ID) == 0 || + GETFLAG(DLNA_STRICT_MASK) ) groupBy[0] = '\0'; - if( GETFLAG(DLNA_STRICT_MASK) ) - groupBy[0] = '\0'; - - where = parse_search_criteria(SearchCriteria); + where = parse_search_criteria(SearchCriteria, sep); DPRINTF(E_DEBUG, L_HTTP, "Translated SearchCriteria: %s\n", where); totalMatches = sql_get_int_field(db, "SELECT (select count(distinct DETAIL_ID)" " from OBJECTS o left join DETAILS d on (o.DETAIL_ID = d.ID)" - " where (OBJECT_ID glob '%q$*') and (%s))" + " where (OBJECT_ID glob '%q%s') and (%s))" " + " "(select count(*) from OBJECTS o left join DETAILS d on (o.DETAIL_ID = d.ID)" " where (OBJECT_ID = '%q') and (%s))", - ContainerID, where, ContainerID, where); + ContainerID, sep, where, ContainerID, where); if( totalMatches < 0 ) { /* Must be invalid SQL, so most likely bad or unhandled search criteria. */ @@ -1707,10 +1707,10 @@ SearchContentDirectory(struct upnphttp * h, const char * action) sql = sqlite3_mprintf( SELECT_COLUMNS "from OBJECTS o left join DETAILS d on (d.ID = o.DETAIL_ID)" - " where OBJECT_ID glob '%q$*' and (%s) %s " + " where OBJECT_ID glob '%q%s' and (%s) %s " "%z %s" " limit %d, %d", - ContainerID, where, groupBy, + ContainerID, sep, where, groupBy, (*ContainerID == '*') ? NULL : sqlite3_mprintf("UNION ALL " SELECT_COLUMNS "from OBJECTS o left join DETAILS d on (d.ID = o.DETAIL_ID)"