diff --git a/scanner.c b/scanner.c index e41316e..30c40e1 100644 --- a/scanner.c +++ b/scanner.c @@ -585,10 +585,10 @@ CreateDatabase(void) "64", "0", "Browse Folders", 0 }; - sql_exec(db, "pragma temp_store = MEMORY"); + sql_exec(db, "pragma page_size = 4096"); sql_exec(db, "pragma journal_mode = OFF"); sql_exec(db, "pragma synchronous = OFF;"); - sql_exec(db, "pragma cache_size = 8192;"); + sql_exec(db, "pragma default_cache_size = 8192;"); //JM: Set up a db version number, so we know if we need to rebuild due to a new structure. sprintf(sql_buf, "pragma user_version = %d;", DB_VERSION); @@ -613,16 +613,16 @@ CreateDatabase(void) "DURATION TEXT, " "BITRATE INTEGER, " "SAMPLERATE INTEGER, " - "ARTIST TEXT, " - "ALBUM TEXT, " - "GENRE TEXT, " + "ARTIST TEXT COLLATE NOCASE, " + "ALBUM TEXT COLLATE NOCASE, " + "GENRE TEXT COLLATE NOCASE, " "COMMENT TEXT, " "CHANNELS INTEGER, " "TRACK INTEGER, " "DATE DATE, " "RESOLUTION TEXT, " "THUMBNAIL BOOL DEFAULT 0, " - "CREATOR TEXT, " + "CREATOR TEXT COLLATE NOCASE, " "DLNA_PN TEXT, " "MIME TEXT, " "ALBUM_ART INTEGER DEFAULT 0, " diff --git a/upnpsoap.c b/upnpsoap.c index bd263a5..1d83470 100644 --- a/upnpsoap.c +++ b/upnpsoap.c @@ -275,14 +275,19 @@ set_filter_flags(char * filter) return flags; } +#define SELECT_COLUMNS "SELECT o.OBJECT_ID, o.PARENT_ID, o.REF_ID, o.DETAIL_ID, o.CLASS," \ + " d.SIZE, d.TITLE, d.DURATION, d.BITRATE, d.SAMPLERATE, d.ARTIST," \ + " d.ALBUM, d.GENRE, d.COMMENT, d.CHANNELS, d.TRACK, d.DATE, d.RESOLUTION," \ + " d.THUMBNAIL, d.CREATOR, d.DLNA_PN, d.MIME, d.ALBUM_ART " + static int callback(void *args, int argc, char **argv, char **azColName) { struct Response *passed_args = (struct Response *)args; - char *id = argv[1], *parent = argv[2], *refID = argv[3], *class = argv[4], *detailID = argv[5], *size = argv[9], *title = argv[10], - *duration = argv[11], *bitrate = argv[12], *sampleFrequency = argv[13], *artist = argv[14], *album = argv[15], - *genre = argv[16], *comment = argv[17], *nrAudioChannels = argv[18], *track = argv[19], *date = argv[20], *resolution = argv[21], - *tn = argv[22], *creator = argv[23], *dlna_pn = argv[24], *mime = argv[25], *album_art = argv[26], *art_dlna_pn = argv[27]; + char *id = argv[0], *parent = argv[1], *refID = argv[2], *detailID = argv[3], *class = argv[4], *size = argv[5], *title = argv[6], + *duration = argv[7], *bitrate = argv[8], *sampleFrequency = argv[9], *artist = argv[10], *album = argv[11], + *genre = argv[12], *comment = argv[13], *nrAudioChannels = argv[14], *track = argv[15], *date = argv[16], *resolution = argv[17], + *tn = argv[18], *creator = argv[19], *dlna_pn = argv[20], *mime = argv[21], *album_art = argv[22]; char dlna_buf[64]; char str_buf[512]; char **result; @@ -373,7 +378,7 @@ callback(void *args, int argc, char **argv, char **azColName) memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1); passed_args->size += ret; if( passed_args->filter & FILTER_UPNP_ALBUMARTURI_DLNA_PROFILEID ) { - ret = sprintf(str_buf, "dlna:profileID=\"%s\" xmlns:dlna=\"urn:schemas-dlnaorg:metadata-1-0/\"", art_dlna_pn); + ret = sprintf(str_buf, "dlna:profileID=\"%s\" xmlns:dlna=\"urn:schemas-dlnaorg:metadata-1-0/\"", "JPEG_TN"); memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1); passed_args->size += ret; } @@ -506,7 +511,7 @@ callback(void *args, int argc, char **argv, char **azColName) memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1); passed_args->size += ret; if( passed_args->filter & FILTER_UPNP_ALBUMARTURI_DLNA_PROFILEID ) { - ret = sprintf(str_buf, "dlna:profileID=\"%s\" xmlns:dlna=\"urn:schemas-dlnaorg:metadata-1-0/\"", art_dlna_pn); + ret = sprintf(str_buf, "dlna:profileID=\"%s\" xmlns:dlna=\"urn:schemas-dlnaorg:metadata-1-0/\"", "JPEG_TN"); memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1); passed_args->size += ret; } @@ -593,13 +598,17 @@ BrowseContentDirectory(struct upnphttp * h, const char * action) if( strcmp(BrowseFlag, "BrowseMetadata") == 0 ) { args.requested = 1; - sql = sqlite3_mprintf("SELECT * from OBJECTS o left join DETAILS d on (d.ID = o.DETAIL_ID) where OBJECT_ID = '%s';", ObjectId); + sql = sqlite3_mprintf( SELECT_COLUMNS + "from OBJECTS o left join DETAILS d on (d.ID = o.DETAIL_ID)" + " where OBJECT_ID = '%s';" + , ObjectId); ret = sqlite3_exec(db, sql, callback, (void *) &args, &zErrMsg); } else { - sql = sqlite3_mprintf("SELECT * from OBJECTS o left join DETAILS d on (d.ID = o.DETAIL_ID)" - " where PARENT_ID = '%s' order by d.TRACK, d.ARTIST, d.TITLE, o.NAME limit %d, -1;", + sql = sqlite3_mprintf( SELECT_COLUMNS + "from OBJECTS o left join DETAILS d on (d.ID = o.DETAIL_ID)" + " where PARENT_ID = '%s' order by d.TRACK, d.ARTIST, d.TITLE limit %d, -1;", ObjectId, StartingIndex); ret = sqlite3_exec(db, sql, callback, (void *) &args, &zErrMsg); } @@ -729,13 +738,15 @@ SearchContentDirectory(struct upnphttp * h, const char * action) } DPRINTF(E_DEBUG, L_HTTP, "Translated SearchCriteria: %s\n", SearchCriteria); - sql = sqlite3_mprintf("SELECT distinct * from OBJECTS o left join DETAILS d on (d.ID = o.DETAIL_ID)" + sql = sqlite3_mprintf( SELECT_COLUMNS + "from OBJECTS o left join DETAILS d on (d.ID = o.DETAIL_ID)" " where OBJECT_ID glob '%s$*' and (%s) group by DETAIL_ID " - "%z" - " order by d.TRACK, d.TITLE, o.NAME limit %d, -1;", + "%z" + " order by d.TRACK, d.TITLE limit %d, -1;", ContainerID, SearchCriteria, (*ContainerID == '*') ? NULL : - sqlite3_mprintf("UNION ALL SELECT * from OBJECTS o left join DETAILS d on (d.ID = o.DETAIL_ID)" + sqlite3_mprintf("UNION ALL " SELECT_COLUMNS + "from OBJECTS o left join DETAILS d on (d.ID = o.DETAIL_ID)" " where OBJECT_ID = '%s' and (%s) ", ContainerID, SearchCriteria), StartingIndex); DPRINTF(E_DEBUG, L_HTTP, "Search SQL: %s\n", sql);