integrate smart playlist parsing into the database
This commit is contained in:
parent
1d0ecad346
commit
8d3d31d119
|
@ -36,7 +36,7 @@ mt_daapd_SOURCES = main.c daapd.h rend.h uici.c uici.h webserver.c \
|
||||||
mp3-scanner.h mp3-scanner.c rend-unix.h strcasestr.c strcasestr.h \
|
mp3-scanner.h mp3-scanner.c rend-unix.h strcasestr.c strcasestr.h \
|
||||||
strsep.c dynamic-art.c dynamic-art.h query.c query.h ssc.c ssc.h \
|
strsep.c dynamic-art.c dynamic-art.h query.c query.h ssc.c ssc.h \
|
||||||
db-generic.c db-generic.h dispatch.c dispatch.h \
|
db-generic.c db-generic.h dispatch.c dispatch.h \
|
||||||
rxml.c rxml.h redblack.c redblack.h scan-mp3.c \
|
rxml.c rxml.h redblack.c redblack.h scan-mp3.c smart-parser.c \
|
||||||
scan-xml.c scan-wma.c scan-aac.c scan-aac.h scan-wav.c scan-url.c \
|
scan-xml.c scan-wma.c scan-aac.c scan-aac.h scan-wav.c scan-url.c \
|
||||||
$(PRENDSRC) $(ORENDSRC) $(HRENDSRC) $(OGGVORBISSRC) $(FLACSRC) \
|
$(PRENDSRC) $(ORENDSRC) $(HRENDSRC) $(OGGVORBISSRC) $(FLACSRC) \
|
||||||
$(SQLITEDB)
|
$(SQLITEDB)
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
#include "dbs-sqlite.h"
|
#include "dbs-sqlite.h"
|
||||||
#include "restart.h"
|
#include "restart.h"
|
||||||
#include "ssc.h"
|
#include "ssc.h"
|
||||||
|
#include "smart-parser.h"
|
||||||
|
|
||||||
/* Globals */
|
/* Globals */
|
||||||
static sqlite *db_sqlite_songs; /**< Database that holds the mp3 info */
|
static sqlite *db_sqlite_songs; /**< Database that holds the mp3 info */
|
||||||
|
@ -63,11 +64,40 @@ int db_sqlite_update(MP3FILE *pmp3);
|
||||||
int db_sqlite_update_version(int from_version);
|
int db_sqlite_update_version(int from_version);
|
||||||
int db_sqlite_get_version(void);
|
int db_sqlite_get_version(void);
|
||||||
int db_sqlite_update_playlists(void);
|
int db_sqlite_update_playlists(void);
|
||||||
|
char *db_sqlite_parse_smart(char *phrase);
|
||||||
|
|
||||||
#define STR(a) (a) ? (a) : ""
|
#define STR(a) (a) ? (a) : ""
|
||||||
#define ISSTR(a) ((a) && strlen((a)))
|
#define ISSTR(a) ((a) && strlen((a)))
|
||||||
#define MAYBEFREE(a) { if((a)) free((a)); };
|
#define MAYBEFREE(a) { if((a)) free((a)); };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get the sql where clause for a smart playlist spec. This
|
||||||
|
* where clause must be freed by the caller
|
||||||
|
*
|
||||||
|
* @param phrase playlist spec to be converted
|
||||||
|
* @returns sql where clause if successful, NULL otherwise
|
||||||
|
*/
|
||||||
|
char *db_sqlite_parse_smart(char *phrase) {
|
||||||
|
PARSETREE pt;
|
||||||
|
char *result = NULL;
|
||||||
|
|
||||||
|
if(strcmp(phrase,"1") == 0)
|
||||||
|
return strdup("1");
|
||||||
|
|
||||||
|
pt=sp_init();
|
||||||
|
if(!pt)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if(!sp_parse(pt,phrase)) {
|
||||||
|
DPRINTF(E_LOG,L_DB,"Error parsing smart playlist: %s",sp_get_error(pt));
|
||||||
|
} else {
|
||||||
|
result = sp_sql_clause(pt);
|
||||||
|
}
|
||||||
|
|
||||||
|
sp_dispose(pt);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* lock the db_mutex
|
* lock the db_mutex
|
||||||
*/
|
*/
|
||||||
|
@ -694,15 +724,20 @@ int db_sqlite_update(MP3FILE *pmp3) {
|
||||||
int db_sqlite_update_playlists(void) {
|
int db_sqlite_update_playlists(void) {
|
||||||
char **resarray;
|
char **resarray;
|
||||||
int rows, cols, index;
|
int rows, cols, index;
|
||||||
|
char *where_clause;
|
||||||
|
|
||||||
db_sqlite_get_table(E_FATAL,&resarray, &rows, &cols, "SELECT * FROM playlists");
|
db_sqlite_get_table(E_FATAL,&resarray, &rows, &cols, "SELECT * FROM playlists");
|
||||||
|
|
||||||
for(index=1;index <= rows; index ++) {
|
for(index=1;index <= rows; index ++) {
|
||||||
DPRINTF(E_DBG,L_DB,"Updating playlist counts for %s\n",resarray[cols * index + 1]);
|
DPRINTF(E_DBG,L_DB,"Updating playlist counts for %s\n",resarray[cols * index + 1]);
|
||||||
if(atoi(resarray[cols * index + 2]) == 1) { // is a smart playlist
|
if(atoi(resarray[cols * index + 2]) == 1) { // is a smart playlist
|
||||||
|
where_clause=db_sqlite_parse_smart(resarray[cols * index + 4]);
|
||||||
|
if(where_clause) {
|
||||||
db_sqlite_exec(E_FATAL,"UPDATE playlists SET items=(SELECT COUNT(*) "
|
db_sqlite_exec(E_FATAL,"UPDATE playlists SET items=(SELECT COUNT(*) "
|
||||||
"FROM songs WHERE %s) WHERE id=%s",resarray[cols * index + 4],
|
"FROM songs WHERE %s) WHERE id=%s",where_clause,
|
||||||
resarray[cols * index]);
|
resarray[cols * index]);
|
||||||
|
free(where_clause);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
db_sqlite_exec(E_FATAL,"UPDATE playlists SET items=(SELECT COUNT(*) "
|
db_sqlite_exec(E_FATAL,"UPDATE playlists SET items=(SELECT COUNT(*) "
|
||||||
"FROM playlistitems WHERE playlistid=%s) WHERE id=%s",
|
"FROM playlistitems WHERE playlistid=%s) WHERE id=%s",
|
||||||
|
@ -727,6 +762,7 @@ int db_sqlite_enum_start(DBQUERYINFO *pinfo) {
|
||||||
char query_select[255];
|
char query_select[255];
|
||||||
char query_count[255];
|
char query_count[255];
|
||||||
char query_rest[4096];
|
char query_rest[4096];
|
||||||
|
char *where_clause;
|
||||||
|
|
||||||
int is_smart;
|
int is_smart;
|
||||||
int have_clause=0;
|
int have_clause=0;
|
||||||
|
@ -769,9 +805,14 @@ int db_sqlite_enum_start(DBQUERYINFO *pinfo) {
|
||||||
is_smart=(atoi(resarray[2]) == 1);
|
is_smart=(atoi(resarray[2]) == 1);
|
||||||
have_clause=1;
|
have_clause=1;
|
||||||
if(is_smart) {
|
if(is_smart) {
|
||||||
|
where_clause=db_sqlite_parse_smart(resarray[3]);
|
||||||
|
if(!where_clause) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
sprintf(query_select,"SELECT * FROM songs ");
|
sprintf(query_select,"SELECT * FROM songs ");
|
||||||
sprintf(query_count,"SELECT COUNT(id) FROM songs ");
|
sprintf(query_count,"SELECT COUNT(id) FROM songs ");
|
||||||
sprintf(query_rest,"WHERE (%s)",resarray[3]);
|
sprintf(query_rest,"WHERE (%s)",where_clause);
|
||||||
|
free(where_clause);
|
||||||
} else {
|
} else {
|
||||||
sprintf(query_select,"SELECT * FROM songs,playlistitems ");
|
sprintf(query_select,"SELECT * FROM songs,playlistitems ");
|
||||||
sprintf(query_count,"SELECT COUNT(id) FROM songs ");
|
sprintf(query_count,"SELECT COUNT(id) FROM songs ");
|
||||||
|
|
|
@ -609,7 +609,7 @@ SP_NODE *sp_parse_oexpr(PARSETREE tree) {
|
||||||
expr=pnew;
|
expr=pnew;
|
||||||
}
|
}
|
||||||
|
|
||||||
sp_enter_exit(tree,"sp_parse_oexptr",0,expr);
|
sp_enter_exit(tree,"sp_parse_oexpr",0,expr);
|
||||||
return expr;
|
return expr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue