library: Updates for new database design

I need a templated primary key system to group together albums with
years.

Signed-off-by: Anna Schumaker <schumaker.anna@gmail.com>
This commit is contained in:
Anna Schumaker 2013-12-08 20:52:14 -05:00 committed by Anna Schumaker
parent 99718ade43
commit eaafaeb7d4
5 changed files with 131 additions and 38 deletions

View File

@ -61,6 +61,7 @@ template <class T>
void Database<T> :: clear()
{
db.clear();
keys.clear();
_size = 0;
}

View File

@ -24,16 +24,16 @@ namespace library
class Artist : public DatabaseEntry {
public:
std:: string name;
std :: string name;
Artist();
Artist(TagLib :: Tag *);
const std::string &primary_key();
void read(File &);
void write(File &);
#ifdef CONFIG_DEBUG
void print();
#endif /* CONFIG_DEBUG */
bool operator==(const Artist &);
};
@ -45,12 +45,12 @@ namespace library
Album();
Album(TagLib :: Tag *, unsigned int);
const std::string &primary_key();
void read(File &);
void write(File &);
#ifdef CONFIG_DEBUG
void print();
#endif /* CONFIG_DEBUG */
bool operator==(const Album &);
};
@ -60,6 +60,7 @@ namespace library
Genre();
Genre(TagLib :: Tag *);
const std::string &primary_key();
void read(File &);
void write(File &);
#ifdef CONFIG_DEBUG
@ -76,6 +77,7 @@ namespace library
Library();
Library(const std::string &, bool);
const std::string &primary_key();
void read(File &);
void write(File &);
#ifdef CONFIG_DEBUG
@ -108,6 +110,7 @@ namespace library
Track(TagLib :: Tag *, TagLib :: AudioProperties *,
unsigned int, unsigned int, unsigned int,
unsigned int, const std :: string &);
const std::string &primary_key();
void read(File &);
void write(File &);
#ifdef CONFIG_DEBUG

View File

@ -5,11 +5,11 @@
#include <glib.h>
static Database<library :: Artist> artist_db("artist.db", DB_UNIQUE);
static Database<library :: Album> album_db("album.db", DB_UNIQUE);
static Database<library :: Genre> genre_db("genre.db", DB_UNIQUE);
static Database<library :: Library> library_db("library.db", DB_NORMAL);
static Database<library :: Track> track_db("track.db", DB_UNIQUE);
static Database<library :: Artist> artist_db("artist.db");
static Database<library :: Album> album_db("album.db");
static Database<library :: Genre> genre_db("genre.db");
static Database<library :: Library> library_db("library.db");
static Database<library :: Track> track_db("track.db");
@ -23,10 +23,15 @@ library :: Artist :: Artist()
}
library :: Artist :: Artist(TagLib :: Tag *tag)
: name(tag->artist().to8Bit(true))
: name(tag->artist().stripWhiteSpace().to8Bit(true))
{
}
const std::string &library :: Artist :: primary_key()
{
return name;
}
void library :: Artist :: read(File &f)
{
name = f.getline();
@ -44,10 +49,6 @@ void library :: Artist :: print()
}
#endif /* CONFIG_DEBUG */
bool library :: Artist :: operator==(const library :: Artist &rhs)
{
return name == rhs.name;
}
/*
@ -60,10 +61,16 @@ library :: Album :: Album()
}
library :: Album :: Album(TagLib :: Tag *tag, unsigned int artist)
: name(tag->album().to8Bit(true)), year(tag->year()), artist_id(artist)
: name(tag->album().stripWhiteSpace().to8Bit(true)),
year(tag->year()), artist_id(artist)
{
}
const std::string &library :: Album :: primary_key()
{
return name;
}
void library :: Album :: read(File &f)
{
f >> artist_id >> year;
@ -82,15 +89,6 @@ void library :: Album :: print()
}
#endif /* CONFIG_DEBUG */
bool library :: Album :: operator==(const library :: Album &rhs)
{
if (artist_id == rhs.artist_id) {
if (name == rhs.name)
return year == rhs.year;
}
return false;
}
/*
@ -107,6 +105,11 @@ library :: Genre :: Genre(TagLib :: Tag *tag)
{
}
const std::string &library :: Genre :: primary_key()
{
return name;
}
void library :: Genre :: read(File &f)
{
name = f.getline();
@ -145,6 +148,11 @@ library :: Library :: Library(const std::string &path, bool is_enabled)
{
}
const std::string &library :: Library :: primary_key()
{
return root_path;
}
void library :: Library :: read(File &f)
{
f >> enabled;
@ -194,6 +202,11 @@ library :: Track :: Track(TagLib :: Tag *tag, TagLib :: AudioProperties *audio,
filepath = path.substr(library_db[library_id].root_path.size() + 1);
}
const std::string &library :: Track :: primary_key()
{
return filepath;
}
void library :: Track :: read(File &f)
{
f >> library_id >> artist_id >> album_id >> genre_id;
@ -243,9 +256,9 @@ static void do_update(unsigned int, const std :: string &);
static void read_tags(unsigned int lib_id, const std :: string &path)
{
TagLib :: Tag *tag;
TagLib :: AudioProperties *audio;
//TagLib :: AudioProperties *audio;
TagLib :: FileRef ref(path.c_str(), true, TagLib :: AudioProperties :: Fast);
unsigned int artist_id, album_id, genre_id;
unsigned int artist_id; //, album_id, genre_id;
if (ref.isNull()) {
print("ERROR: Could not read tags for file %s", path.c_str());
@ -253,13 +266,14 @@ static void read_tags(unsigned int lib_id, const std :: string &path)
}
tag = ref.tag();
audio = ref.audioProperties();
artist_id = artist_db.insert(tag);
album_id = album_db.insert(library :: Album(tag, artist_id));
genre_id = genre_db.insert(library :: Genre(tag));
track_db.insert(library :: Track(tag, audio, lib_id, artist_id,
album_id, genre_id, path));
//audio = ref.audioProperties();
artist_id = artist_db.insert(library :: Artist(tag));
/*album_id =*/ album_db.insert(library :: Album(tag, artist_id));
/*genre_id = genre_db.insert(library :: Genre(tag));*/
/*track_db.insert(library :: Track(tag, audio, lib_id, artist_id,
album_id, genre_id, path));*/
}
static void process_path(unsigned int lib_id, const std :: string &dir,

View File

@ -55,6 +55,7 @@ void test_print_dbs(const std::string &test)
{
print("Test %s\n", test.c_str());
library :: print_db(library :: DB_GENRE);
print("\n");
}
@ -70,7 +71,7 @@ void test_0()
void test_1()
{
test_add_dir("1a", "/tmp/library/0", true);
library :: del_path(0);
test_del_dir("1b", 0);
print("\n");
}
@ -114,12 +115,12 @@ void test_4()
library :: print_db(library :: DB_ARTIST);
print("\n");
library :: print_db(library :: DB_ALBUM);
print("\n");
//library :: print_db(library :: DB_ALBUM);
//print("\n");
library :: print_db(library :: DB_GENRE);
print("\n");
library :: print_db(library :: DB_TRACK);
print("\n");
//library :: print_db(library :: DB_TRACK);
//print("\n");
}
/* Test lookup() */
@ -146,7 +147,7 @@ int main(int argc, char **argv)
test_1();
test_2();
test_3();
test_4();
test_5();
//test_4();
//test_5();
return 0;
}

View File

@ -0,0 +1,74 @@
Generating library: 0
Generating library: 1
Generating library: 2
Generating library: 3
Generating library: 4
Test 0a: PASSED
Allocated rows: 0
Valid rows: 0
Test 0b: PASSED
Allocated rows: 0
Valid rows: 0
Test 1a: PASSED
Allocated rows: 1
Valid rows: 1
db[0] = /tmp/library/0 (enabled)
Test 1b
Allocated rows: 1
Valid rows: 0
Test 2a: PASSED
Allocated rows: 1
Valid rows: 1
db[0] = /tmp/library/0 (enabled)
Test 2b: PASSED
Allocated rows: 2
Valid rows: 2
db[0] = /tmp/library/0 (enabled)
db[1] = /tmp/library/1 (enabled)
Test 2c: PASSED
Allocated rows: 3
Valid rows: 3
db[0] = /tmp/library/0 (enabled)
db[1] = /tmp/library/1 (enabled)
db[2] = /tmp/library/2 (enabled)
Test 2d
Allocated rows: 3
Valid rows: 2
db[0] = /tmp/library/0 (enabled)
db[2] = /tmp/library/2 (enabled)
Test 2e
Allocated rows: 3
Valid rows: 1
db[2] = /tmp/library/2 (enabled)
Test 2f
Allocated rows: 3
Valid rows: 0
Test 3a: PASSED
Allocated rows: 1
Valid rows: 1
db[0] = /tmp/library/0 (enabled)
Test 3b: PASSED
Allocated rows: 2
Valid rows: 2
db[0] = /tmp/library/0 (enabled)
db[1] = /tmp/library/1 (enabled)
Test 3c: PASSED
Allocated rows: 3
Valid rows: 3
db[0] = /tmp/library/0 (enabled)
db[1] = /tmp/library/1 (enabled)
db[2] = /tmp/library/2 (enabled)
Test 3d
Allocated rows: 0
Valid rows: 0
Test 3e
Allocated rows: 3
Valid rows: 3
db[0] = /tmp/library/0 (enabled)
db[1] = /tmp/library/1 (enabled)
db[2] = /tmp/library/2 (enabled)