[Mt-daapd-cvs] SF.net SVN: mt-daapd: [1702] trunk/src
Status: Beta
Brought to you by:
andrew40
From: <rp...@us...> - 2007-12-12 05:22:49
|
Revision: 1702 http://mt-daapd.svn.sourceforge.net/mt-daapd/?rev=1702&view=rev Author: rpedde Date: 2007-12-11 21:22:47 -0800 (Tue, 11 Dec 2007) Log Message: ----------- implement paging. still to be done - playlist persistence, db in-place upgrades, fix sqlite3, and browsing Modified Paths: -------------- trunk/src/db.c trunk/src/playlists.h Modified: trunk/src/db.c =================================================================== --- trunk/src/db.c 2007-12-10 07:51:24 UTC (rev 1701) +++ trunk/src/db.c 2007-12-12 05:22:47 UTC (rev 1702) @@ -23,6 +23,7 @@ #include "config.h" #endif +#include <limits.h> #include <pthread.h> #include <stdarg.h> #include <stdio.h> @@ -74,6 +75,7 @@ typedef struct enum_helper_t { PLENUMHANDLE handle; char **result; + int current_position; } ENUMHELPER; #define MAYBEFREE(a) if((a)) free((a)); @@ -405,8 +407,14 @@ */ int db_enum_start(char **pe, DB_QUERY *pinfo) { char *e_pl; + ENUMHELPER *peh; + PLAYLIST_NATIVE *ppn; db_readlock(); + + if(pinfo->limit == 0) + pinfo->limit = INT_MAX; + pinfo->priv = (void*)malloc(sizeof(ENUMHELPER)); if(!pinfo->priv) { db_set_error(pe,DB_E_MALLOC); @@ -414,14 +422,25 @@ return DB_E_MALLOC; } memset(pinfo->priv,0,sizeof(ENUMHELPER)); + peh = pinfo->priv; /* worry about playlists and items first */ switch(pinfo->query_type) { case QUERY_TYPE_ITEMS: /* this won't work with a query */ - ((ENUMHELPER *)pinfo->priv)->handle = (void*)pl_enum_items_start(&e_pl, pinfo->playlist_id); + ppn = pl_fetch_playlist_id(&e_pl, pinfo->playlist_id); + if(!ppn) { + db_unlock(); + db_set_error(pe,DB_E_PLAYLIST,e_pl); + free(e_pl); + free(pinfo->priv); + return DB_E_PLAYLIST; + } + pinfo->totalcount = ppn->items; + pl_dispose_playlist(ppn); + peh->handle = (void*)pl_enum_items_start(&e_pl, pinfo->playlist_id); - if(!((ENUMHELPER*)pinfo->priv)->handle) { + if(!peh->handle) { db_unlock(); db_set_error(pe,DB_E_PLAYLIST,e_pl); free(e_pl); @@ -432,9 +451,9 @@ case QUERY_TYPE_PLAYLISTS: pl_get_playlist_count(pe, &pinfo->totalcount); - ((ENUMHELPER *)pinfo->priv)->handle = (void*)pl_enum_start(&e_pl); + peh->handle = (void*)pl_enum_start(&e_pl); - if(!((ENUMHELPER*)pinfo->priv)->handle) { + if(!peh->handle) { db_unlock(); db_set_error(pe,DB_E_PLAYLIST,e_pl); free(e_pl); @@ -459,6 +478,7 @@ int db_enum_fetch(char **pe, char ***result, DB_QUERY *pquery) { uint32_t id; ENUMHELPER *peh; + int err; ASSERT((pquery) && (pquery->priv)); @@ -476,8 +496,19 @@ peh->result = NULL; } - id = pl_enum_items_fetch(NULL, peh->handle); + if(peh->current_position - pquery->offset >= pquery->limit) { + *result = NULL; + return DB_E_SUCCESS; + } + while(1) { + id = pl_enum_items_fetch(NULL, peh->handle); + peh->current_position++; + + if((peh->current_position > pquery->offset) || (!id)) + break; + } + if(!id) { *result = NULL; return DB_E_SUCCESS; @@ -488,8 +519,22 @@ *result = peh->result; break; case QUERY_TYPE_PLAYLISTS: - return pl_enum_fetch(pe, result, peh->handle); + if(peh->current_position - pquery->offset >= pquery->limit) { + *result = NULL; + return DB_E_SUCCESS; + } + + while(1) { + err = pl_enum_fetch(pe, result, peh->handle); + peh->current_position++; + if((peh->current_position > pquery->offset) || + (err != PL_E_SUCCESS) || + (!*result)) + break; + } + return err; break; + case QUERY_TYPE_DISTINCT: *result = NULL; break; Modified: trunk/src/playlists.h =================================================================== --- trunk/src/playlists.h 2007-12-10 07:51:24 UTC (rev 1701) +++ trunk/src/playlists.h 2007-12-12 05:22:47 UTC (rev 1702) @@ -50,6 +50,7 @@ extern int pl_delete_playlist(char **pe, uint32_t playlistid); extern int pl_delete_playlist_item(char **pe, uint32_t playlistid, uint32_t songid); extern int pl_get_playlist_count(char **pe, int *count); + extern PLAYLIST_NATIVE *pl_fetch_playlist(char **pe, char *path, uint32_t index); extern PLAYLIST_NATIVE *pl_fetch_playlist_id(char **pe, uint32_t id); extern void pl_dispose_playlist(PLAYLIST_NATIVE *ppln); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |