summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiika Pekkarinen <miipekk@ihme.org>2008-08-29 21:14:58 +0000
committerMiika Pekkarinen <miipekk@ihme.org>2008-08-29 21:14:58 +0000
commitd8bb6701e7f860997ce18a28c5eb8af66ac75f9f (patch)
tree915dcffd028f53cb747322d1786ca87760246abc
parent5d22e3cbdd251819a4d2d07b9a12994d5aef778d (diff)
downloadrockbox-d8bb6701e7f860997ce18a28c5eb8af66ac75f9f.tar.gz
rockbox-d8bb6701e7f860997ce18a28c5eb8af66ac75f9f.tar.bz2
rockbox-d8bb6701e7f860997ce18a28c5eb8af66ac75f9f.zip
Fixed a possible index id destruction and temporary problems with the DB when DB has been loaded to ram, dircache enabled and statistics gathering ON. Fixed serial (affecting last played song order) being one too low after importing the changelog. A bit of code cleanup and comments also.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@18363 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/tagcache.c25
-rw-r--r--apps/tagcache.h8
2 files changed, 23 insertions, 10 deletions
diff --git a/apps/tagcache.c b/apps/tagcache.c
index 9455b97327..ffad383b47 100644
--- a/apps/tagcache.c
+++ b/apps/tagcache.c
@@ -55,6 +55,8 @@
*
*/
+/* #define LOGF_ENABLE */
+
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
@@ -100,7 +102,6 @@ static const char tagcache_thread_name[] = "tagcache";
/* Previous path when scanning directory tree recursively. */
static char curpath[TAG_MAXLEN+32];
-static long curpath_size = sizeof(curpath);
/* Used when removing duplicates. */
static char *tempbuf; /* Allocated when needed. */
@@ -190,7 +191,11 @@ struct master_header {
/* For the endianess correction */
static const char *tagfile_entry_ec = "ss";
-static const char *index_entry_ec = "lllllllllllllllllllll"; /* (1 + TAG_COUNT) * l */
+/**
+ Note: This should be (1 + TAG_COUNT) amount of l's.
+ */
+static const char *index_entry_ec = "lllllllllllllllllllll";
+
static const char *tagcache_header_ec = "lll";
static const char *master_header_ec = "llllll";
@@ -654,8 +659,9 @@ static bool write_index(int masterfd, int idxid, struct index_entry *idx)
}
}
- /* Don't touch the dircache flag. */
- idx_ram->flag = idx->flag | (idx_ram->flag & FLAG_DIRCACHE);
+ /* Don't touch the dircache flag or attributes. */
+ idx_ram->flag = (idx->flag & 0x0000ffff)
+ | (idx_ram->flag & (0xffff0000 | FLAG_DIRCACHE));
}
#endif
@@ -1693,6 +1699,9 @@ static void add_tagcache(char *path, unsigned long mtime
{
struct index_entry idx;
+ /* TODO: Mark that the index exists (for fast reverse scan) */
+ //found_idx[idx_id/8] |= idx_id%8;
+
if (!get_index(-1, idx_id, &idx, true))
{
logf("failed to retrieve index entry");
@@ -2621,7 +2630,7 @@ static int build_index(int index_type, struct tagcache_header *h, int tmpfd)
if (idxbuf[j].tag_seek[index_type] < 0)
{
- logf("update error: %d/%d/%ld",
+ logf("update error: %d/%d/%d",
idxbuf[j].flag, i+j, tcmh.tch.entry_count);
error = true;
goto error_exit;
@@ -3308,8 +3317,8 @@ static int parse_changelog_line(int line_n, const char *buf, void *parameters)
idx.tag_seek[import_tags[i]] = data;
- if (import_tags[i] == tag_lastplayed && data > current_tcmh.serial)
- current_tcmh.serial = data;
+ if (import_tags[i] == tag_lastplayed && data >= current_tcmh.serial)
+ current_tcmh.serial = data + 1;
else if (import_tags[i] == tag_commitid && data >= current_tcmh.commitid)
current_tcmh.commitid = data + 1;
}
@@ -4114,7 +4123,7 @@ static bool check_dir(const char *dirname, int add_files)
yield();
len = strlen(curpath);
- snprintf(&curpath[len], curpath_size - len, "/%s",
+ snprintf(&curpath[len], sizeof(curpath) - len, "/%s",
entry->d_name);
processed_dir_count++;
diff --git a/apps/tagcache.h b/apps/tagcache.h
index 9415c9815e..e49b65f1f3 100644
--- a/apps/tagcache.h
+++ b/apps/tagcache.h
@@ -24,17 +24,21 @@
#include "id3.h"
+/**
+ Note: When adding new tags, make sure to update index_entry_ec in
+ tagcache.c and bump up the header version too.
+ */
enum tag_type { tag_artist = 0, tag_album, tag_genre, tag_title,
tag_filename, tag_composer, tag_comment, tag_albumartist, tag_grouping, tag_year,
tag_discnumber, tag_tracknumber, tag_bitrate, tag_length, tag_playcount, tag_rating,
tag_playtime, tag_lastplayed, tag_commitid, tag_mtime,
+ /* Real tags end here, count them. */
+ TAG_COUNT,
/* Virtual tags */
tag_virt_length_min, tag_virt_length_sec,
tag_virt_playtime_min, tag_virt_playtime_sec,
tag_virt_entryage, tag_virt_autoscore };
-#define TAG_COUNT 20
-
/* Maximum length of a single tag. */
#define TAG_MAXLEN (MAX_PATH*2)