forked from len0rd/rockbox
Enable conditional clauses for string tags in disk mode also.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@9559 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
0be0b43466
commit
53e921c4c3
2 changed files with 38 additions and 2 deletions
|
@ -489,14 +489,23 @@ static bool build_lookup_list(struct tagcache_search *tcs)
|
||||||
/* Check for conditions. */
|
/* Check for conditions. */
|
||||||
for (i = 0; i < tcs->clause_count; i++)
|
for (i = 0; i < tcs->clause_count; i++)
|
||||||
{
|
{
|
||||||
|
struct tagfile_entry tfe;
|
||||||
int seek = entry.tag_seek[tcs->clause[i]->tag];
|
int seek = entry.tag_seek[tcs->clause[i]->tag];
|
||||||
char str[64];
|
char str[64];
|
||||||
|
|
||||||
memset(str, 0, sizeof str);
|
memset(str, 0, sizeof str);
|
||||||
if (!tagcache_is_numeric_tag(tcs->clause[i]->tag))
|
if (!tagcache_is_numeric_tag(tcs->clause[i]->tag))
|
||||||
{
|
{
|
||||||
/* FIXME: Not yet implemented. */
|
int fd = tcs->idxfd[tcs->clause[i]->tag];
|
||||||
// str = &hdr->tags[tcs->clause[i].tag][seek];
|
lseek(fd, seek, SEEK_SET);
|
||||||
|
read(fd, &tfe, sizeof(struct tagfile_entry));
|
||||||
|
if (tfe.tag_length >= (int)sizeof(str))
|
||||||
|
{
|
||||||
|
logf("Too long tag read!");
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
|
||||||
|
read(fd, str, tfe.tag_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!check_against_clause(seek, str, tcs->clause[i]))
|
if (!check_against_clause(seek, str, tcs->clause[i]))
|
||||||
|
@ -531,6 +540,7 @@ bool tagcache_search(struct tagcache_search *tcs, int tag)
|
||||||
{
|
{
|
||||||
struct tagcache_header h;
|
struct tagcache_header h;
|
||||||
char buf[MAX_PATH];
|
char buf[MAX_PATH];
|
||||||
|
int i;
|
||||||
|
|
||||||
if (tcs->valid)
|
if (tcs->valid)
|
||||||
tagcache_search_finish(tcs);
|
tagcache_search_finish(tcs);
|
||||||
|
@ -545,6 +555,9 @@ bool tagcache_search(struct tagcache_search *tcs, int tag)
|
||||||
tcs->valid = true;
|
tcs->valid = true;
|
||||||
tcs->masterfd = -1;
|
tcs->masterfd = -1;
|
||||||
|
|
||||||
|
for (i = 0; i < TAG_COUNT; i++)
|
||||||
|
tcs->idxfd[i] = -1;
|
||||||
|
|
||||||
#ifndef HAVE_TC_RAMCACHE
|
#ifndef HAVE_TC_RAMCACHE
|
||||||
tcs->ramsearch = false;
|
tcs->ramsearch = false;
|
||||||
#else
|
#else
|
||||||
|
@ -567,6 +580,8 @@ bool tagcache_search(struct tagcache_search *tcs, int tag)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tcs->idxfd[tcs->type] = tcs->fd;
|
||||||
|
|
||||||
/* Check the header. */
|
/* Check the header. */
|
||||||
if (read(tcs->fd, &h, sizeof(struct tagcache_header)) !=
|
if (read(tcs->fd, &h, sizeof(struct tagcache_header)) !=
|
||||||
sizeof(struct tagcache_header) || h.magic != TAGCACHE_MAGIC)
|
sizeof(struct tagcache_header) || h.magic != TAGCACHE_MAGIC)
|
||||||
|
@ -617,6 +632,14 @@ bool tagcache_search_add_clause(struct tagcache_search *tcs,
|
||||||
logf("Too many clauses");
|
logf("Too many clauses");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!tagcache_is_numeric_tag(clause->tag) && tcs->idxfd[clause->tag] < 0)
|
||||||
|
{
|
||||||
|
char buf[MAX_PATH];
|
||||||
|
|
||||||
|
snprintf(buf, sizeof buf, TAGCACHE_FILE_INDEX, clause->tag);
|
||||||
|
tcs->idxfd[clause->tag] = open(buf, O_RDONLY);
|
||||||
|
}
|
||||||
|
|
||||||
tcs->clause[tcs->clause_count] = clause;
|
tcs->clause[tcs->clause_count] = clause;
|
||||||
tcs->clause_count++;
|
tcs->clause_count++;
|
||||||
|
@ -753,10 +776,13 @@ void tagcache_modify(struct tagcache_search *tcs, int type, const char *text)
|
||||||
|
|
||||||
void tagcache_search_finish(struct tagcache_search *tcs)
|
void tagcache_search_finish(struct tagcache_search *tcs)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
if (tcs->fd >= 0)
|
if (tcs->fd >= 0)
|
||||||
{
|
{
|
||||||
close(tcs->fd);
|
close(tcs->fd);
|
||||||
tcs->fd = -1;
|
tcs->fd = -1;
|
||||||
|
tcs->idxfd[tcs->type] = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tcs->masterfd >= 0)
|
if (tcs->masterfd >= 0)
|
||||||
|
@ -764,6 +790,15 @@ void tagcache_search_finish(struct tagcache_search *tcs)
|
||||||
close(tcs->masterfd);
|
close(tcs->masterfd);
|
||||||
tcs->masterfd = -1;
|
tcs->masterfd = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < TAG_COUNT; i++)
|
||||||
|
{
|
||||||
|
if (tcs->idxfd[i] >= 0)
|
||||||
|
{
|
||||||
|
close(tcs->idxfd[i]);
|
||||||
|
tcs->idxfd[i] = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
tcs->ramsearch = false;
|
tcs->ramsearch = false;
|
||||||
tcs->valid = false;
|
tcs->valid = false;
|
||||||
|
|
|
@ -58,6 +58,7 @@ struct tagcache_search_clause
|
||||||
struct tagcache_search {
|
struct tagcache_search {
|
||||||
/* For internal use only. */
|
/* For internal use only. */
|
||||||
int fd, masterfd;
|
int fd, masterfd;
|
||||||
|
int idxfd[TAG_COUNT];
|
||||||
long seek_list[SEEK_LIST_SIZE];
|
long seek_list[SEEK_LIST_SIZE];
|
||||||
long filter_tag[TAGCACHE_MAX_FILTERS];
|
long filter_tag[TAGCACHE_MAX_FILTERS];
|
||||||
long filter_seek[TAGCACHE_MAX_FILTERS];
|
long filter_seek[TAGCACHE_MAX_FILTERS];
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue