core/database: Introduce the dbe_alloc() database operation
For allocating new database items from a given key. Tracks do not need this function since we have special handling for creation and insertion. Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
parent
ab1572ed34
commit
049156a523
|
@ -9,17 +9,18 @@ index_entry :: index_entry()
|
||||||
ie_set = SET_INIT();
|
ie_set = SET_INIT();
|
||||||
}
|
}
|
||||||
|
|
||||||
index_entry :: index_entry(const std::string &key)
|
|
||||||
: ie_key(key)
|
|
||||||
{
|
|
||||||
ie_set = SET_INIT();
|
|
||||||
}
|
|
||||||
|
|
||||||
index_entry :: ~index_entry()
|
index_entry :: ~index_entry()
|
||||||
{
|
{
|
||||||
set_deinit(&ie_set);
|
set_deinit(&ie_set);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct db_entry *index_alloc(const gchar *key)
|
||||||
|
{
|
||||||
|
struct index_entry *ent = new struct index_entry;
|
||||||
|
ent->ie_key = key;
|
||||||
|
return ent;
|
||||||
|
}
|
||||||
|
|
||||||
const std::string index_entry :: primary_key() const
|
const std::string index_entry :: primary_key() const
|
||||||
{
|
{
|
||||||
return ie_key;
|
return ie_key;
|
||||||
|
@ -43,6 +44,7 @@ void index_entry :: read(file &file)
|
||||||
|
|
||||||
|
|
||||||
static const struct db_ops index_ops = {
|
static const struct db_ops index_ops = {
|
||||||
|
index_alloc,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -36,9 +36,11 @@ static void __album_from_key(struct album *album, const gchar *key)
|
||||||
|
|
||||||
album :: album() : al_year(0), al_name("") {}
|
album :: album() : al_year(0), al_name("") {}
|
||||||
|
|
||||||
album :: album(const std::string &key)
|
static struct db_entry *album_alloc(const gchar *key)
|
||||||
{
|
{
|
||||||
__album_from_key(this, key.c_str());
|
struct album *album = new struct album;
|
||||||
|
__album_from_key(album, key);
|
||||||
|
return album;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string album :: primary_key() const
|
const std::string album :: primary_key() const
|
||||||
|
@ -60,6 +62,7 @@ void album :: write(file &file)
|
||||||
|
|
||||||
|
|
||||||
static const struct db_ops album_ops = {
|
static const struct db_ops album_ops = {
|
||||||
|
album_alloc,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -12,14 +12,16 @@ static database<struct artist> artist_db;
|
||||||
|
|
||||||
artist :: artist() {}
|
artist :: artist() {}
|
||||||
|
|
||||||
artist :: artist(const std::string &name)
|
static db_entry *artist_alloc(const gchar *name)
|
||||||
{
|
{
|
||||||
gchar *lower = string_lowercase(name.c_str());
|
struct artist *artist = new struct artist;
|
||||||
|
gchar *lower = string_lowercase(name);
|
||||||
|
|
||||||
ar_name = name;
|
artist->ar_name = name;
|
||||||
ar_lower = lower;
|
artist->ar_lower = lower;
|
||||||
|
|
||||||
g_free(lower);
|
g_free(lower);
|
||||||
|
return artist;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string artist :: primary_key() const
|
const std::string artist :: primary_key() const
|
||||||
|
@ -46,6 +48,7 @@ void artist :: write(file &file)
|
||||||
|
|
||||||
|
|
||||||
static const struct db_ops artist_ops = {
|
static const struct db_ops artist_ops = {
|
||||||
|
artist_alloc,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -11,14 +11,16 @@ static database<struct genre> genre_db;
|
||||||
|
|
||||||
genre :: genre() {}
|
genre :: genre() {}
|
||||||
|
|
||||||
genre :: genre(const std::string &name)
|
static struct db_entry *genre_alloc(const gchar *name)
|
||||||
{
|
{
|
||||||
gchar *lower = string_lowercase(name.c_str());
|
struct genre *genre = new struct genre;
|
||||||
|
gchar *lower = string_lowercase(name);
|
||||||
|
|
||||||
ge_name = name;
|
genre->ge_name = name;
|
||||||
ge_lower = lower;
|
genre->ge_lower = lower;
|
||||||
|
|
||||||
g_free(lower);
|
g_free(lower);
|
||||||
|
return genre;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string genre :: primary_key() const
|
const std::string genre :: primary_key() const
|
||||||
|
@ -45,6 +47,7 @@ void genre :: write(file &file)
|
||||||
|
|
||||||
|
|
||||||
static const struct db_ops genre_ops = {
|
static const struct db_ops genre_ops = {
|
||||||
|
genre_alloc,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -12,9 +12,13 @@ library :: library()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
library :: library(const std::string &path)
|
static struct db_entry *library_alloc(const gchar *path)
|
||||||
: li_size(0), li_enabled(true), li_path(path)
|
|
||||||
{
|
{
|
||||||
|
struct library *library = new struct library;
|
||||||
|
library->li_size = 0;
|
||||||
|
library->li_enabled = true;
|
||||||
|
library->li_path = path;
|
||||||
|
return library;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string library :: primary_key() const
|
const std::string library :: primary_key() const
|
||||||
|
@ -42,6 +46,7 @@ void library :: write(file &file)
|
||||||
|
|
||||||
|
|
||||||
static const struct db_ops library_ops = {
|
static const struct db_ops library_ops = {
|
||||||
|
library_alloc,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,6 @@ struct db_entry {
|
||||||
unsigned int dbe_index; /* The db_entry's position in the database. */
|
unsigned int dbe_index; /* The db_entry's position in the database. */
|
||||||
|
|
||||||
db_entry(); /**< Initialize _index to 0. */
|
db_entry(); /**< Initialize _index to 0. */
|
||||||
db_entry(const std::string);
|
|
||||||
virtual ~db_entry() = 0; /**< Virtual destructor */
|
virtual ~db_entry() = 0; /**< Virtual destructor */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -52,6 +51,8 @@ struct db_entry {
|
||||||
|
|
||||||
|
|
||||||
struct db_ops {
|
struct db_ops {
|
||||||
|
/* Allocate a new struct db_entry from a given key. */
|
||||||
|
struct db_entry *(*dbe_alloc)(const gchar *);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -167,6 +167,7 @@ T *db_find(struct database<T> *db, const gchar *key)
|
||||||
T *dbe = db_get(db, key);
|
T *dbe = db_get(db, key);
|
||||||
if (dbe)
|
if (dbe)
|
||||||
return dbe;
|
return dbe;
|
||||||
return db_insert(db, new T(key));
|
dbe = (T *)db->db_ops->dbe_alloc(key);
|
||||||
|
return db_insert(db, dbe);
|
||||||
}
|
}
|
||||||
#endif /* OCARINA_DATABASE_HPP */
|
#endif /* OCARINA_DATABASE_HPP */
|
||||||
|
|
|
@ -21,16 +21,8 @@ struct index_entry : public db_entry {
|
||||||
struct set ie_set;
|
struct set ie_set;
|
||||||
|
|
||||||
index_entry(); /**< Create an empty IndexEntry. */
|
index_entry(); /**< Create an empty IndexEntry. */
|
||||||
|
|
||||||
/**
|
|
||||||
* Create an IndexEntry with a specific key.
|
|
||||||
*
|
|
||||||
* @param key The key associated with this IndexEntry.
|
|
||||||
*/
|
|
||||||
index_entry(const std::string &);
|
|
||||||
~index_entry();
|
~index_entry();
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Access the key stored by this IndexEntry.
|
* Access the key stored by this IndexEntry.
|
||||||
*
|
*
|
||||||
|
|
|
@ -24,11 +24,6 @@ struct album : public db_entry {
|
||||||
|
|
||||||
album(); /**< Album tag constructor */
|
album(); /**< Album tag constructor */
|
||||||
|
|
||||||
/**
|
|
||||||
* Album tag constructor
|
|
||||||
*/
|
|
||||||
album(const std::string &);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The album's primary key is the concatenation of year
|
* The album's primary key is the concatenation of year
|
||||||
* and name, allowing for multiple albums with the same
|
* and name, allowing for multiple albums with the same
|
||||||
|
|
|
@ -16,13 +16,6 @@ struct artist : public db_entry {
|
||||||
|
|
||||||
artist(); /**< Artist tag constructor. */
|
artist(); /**< Artist tag constructor. */
|
||||||
|
|
||||||
/**
|
|
||||||
* Artist tag constructor
|
|
||||||
*
|
|
||||||
* @param name Artist name.
|
|
||||||
*/
|
|
||||||
artist(const std::string &);
|
|
||||||
|
|
||||||
const std::string primary_key() const;
|
const std::string primary_key() const;
|
||||||
void read(file &);
|
void read(file &);
|
||||||
void write(file &);
|
void write(file &);
|
||||||
|
|
|
@ -17,13 +17,6 @@ public:
|
||||||
|
|
||||||
genre(); /**< Genre tag constructor. */
|
genre(); /**< Genre tag constructor. */
|
||||||
|
|
||||||
/**
|
|
||||||
* Genre tag constructor.
|
|
||||||
*
|
|
||||||
* @param name Genre name.
|
|
||||||
*/
|
|
||||||
genre(const std::string &);
|
|
||||||
|
|
||||||
const std::string primary_key() const;
|
const std::string primary_key() const;
|
||||||
void read(file &);
|
void read(file &);
|
||||||
void write(file &);
|
void write(file &);
|
||||||
|
|
|
@ -24,13 +24,6 @@ struct library : public db_entry {
|
||||||
|
|
||||||
library(); /**< Library tag constructor. */
|
library(); /**< Library tag constructor. */
|
||||||
|
|
||||||
/**
|
|
||||||
* Library tag constructor.
|
|
||||||
*
|
|
||||||
* @param path Path to the library directory on disk.
|
|
||||||
*/
|
|
||||||
library(const std::string &);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called to access the library tag's primary key.
|
* Called to access the library tag's primary key.
|
||||||
*
|
*
|
||||||
|
|
|
@ -17,7 +17,6 @@ struct int_entry : public db_entry {
|
||||||
|
|
||||||
int_entry() : ie_val(0) {};
|
int_entry() : ie_val(0) {};
|
||||||
int_entry(unsigned int v) : ie_val(v) {};
|
int_entry(unsigned int v) : ie_val(v) {};
|
||||||
int_entry(const std::string &k) { sscanf(k.c_str(), "%u", &ie_val); }
|
|
||||||
|
|
||||||
const std::string primary_key() const
|
const std::string primary_key() const
|
||||||
{
|
{
|
||||||
|
@ -31,16 +30,25 @@ struct int_entry : public db_entry {
|
||||||
void read(file &f) { file_readf(&f, "%u", &ie_val); }
|
void read(file &f) { file_readf(&f, "%u", &ie_val); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct db_entry *int_alloc(const gchar *key)
|
||||||
|
{
|
||||||
|
struct int_entry *ent = new int_entry;
|
||||||
|
sscanf(key, "%u", &ent->ie_val);
|
||||||
|
return ent;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static const struct db_ops int_ops = {
|
static const struct db_ops int_ops = {
|
||||||
|
int_alloc,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static void test_db_entry()
|
static void test_db_entry()
|
||||||
{
|
{
|
||||||
struct int_entry *ent = new struct int_entry(1);
|
struct int_entry *ent;
|
||||||
struct file f;
|
struct file f;
|
||||||
|
|
||||||
|
ent = (struct int_entry *)int_ops.dbe_alloc("1");
|
||||||
test_equal(ent->dbe_index, 0);
|
test_equal(ent->dbe_index, 0);
|
||||||
test_equal(ent->ie_val, 1);
|
test_equal(ent->ie_val, 1);
|
||||||
test_equal(ent->primary_key(), "1");
|
test_equal(ent->primary_key(), "1");
|
||||||
|
|
|
@ -8,11 +8,12 @@
|
||||||
|
|
||||||
static void test_entry()
|
static void test_entry()
|
||||||
{
|
{
|
||||||
index_entry *ie = new index_entry("Link");
|
|
||||||
struct set_iter it;
|
struct set_iter it;
|
||||||
|
index_entry *ie;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
struct file f;
|
struct file f;
|
||||||
|
|
||||||
|
ie = (index_entry *)test_index_ops()->dbe_alloc("Link");
|
||||||
test_equal(ie->primary_key(), "Link");
|
test_equal(ie->primary_key(), "Link");
|
||||||
set_insert(&ie->ie_set, 0);
|
set_insert(&ie->ie_set, 0);
|
||||||
set_insert(&ie->ie_set, 1);
|
set_insert(&ie->ie_set, 1);
|
||||||
|
|
|
@ -22,9 +22,11 @@ static void test_verify_hyrule(struct album *album)
|
||||||
|
|
||||||
static void test_album()
|
static void test_album()
|
||||||
{
|
{
|
||||||
struct album *album = new struct album("1998 Hyrule Symphony");
|
const struct db_ops *album_ops = test_album_ops();
|
||||||
|
struct album *album;
|
||||||
file f;
|
file f;
|
||||||
|
|
||||||
|
album = (struct album *)album_ops->dbe_alloc("1998 Hyrule Symphony");
|
||||||
test_verify_hyrule(album);
|
test_verify_hyrule(album);
|
||||||
|
|
||||||
file_init(&f, "album_tag", 0);
|
file_init(&f, "album_tag", 0);
|
||||||
|
@ -49,8 +51,11 @@ static void test_album()
|
||||||
|
|
||||||
static void test_album_compare()
|
static void test_album_compare()
|
||||||
{
|
{
|
||||||
struct album *twilight = new struct album("2006 Twilight Princess");
|
const struct db_ops *album_ops = test_album_ops();
|
||||||
struct album *skyward = new struct album("2011 skyward sword");
|
struct album *twilight, *skyward;
|
||||||
|
|
||||||
|
twilight = (struct album *)album_ops->dbe_alloc("2006 Twilight Princess");
|
||||||
|
skyward = (struct album *)album_ops->dbe_alloc("2011 skyward sword");
|
||||||
|
|
||||||
test_equal(album_compare(twilight, twilight), 0);
|
test_equal(album_compare(twilight, twilight), 0);
|
||||||
test_equal(album_compare(twilight, skyward), 1);
|
test_equal(album_compare(twilight, skyward), 1);
|
||||||
|
|
|
@ -20,10 +20,12 @@ static void test_verify_koji(struct artist *artist)
|
||||||
|
|
||||||
static void test_artist()
|
static void test_artist()
|
||||||
{
|
{
|
||||||
struct artist *artist = new struct artist("Koji Kondo");
|
const struct db_ops *artist_ops = test_artist_ops();
|
||||||
|
struct artist *artist;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
file f;
|
file f;
|
||||||
|
|
||||||
|
artist = (struct artist *)artist_ops->dbe_alloc("Koji Kondo");
|
||||||
test_verify_koji(artist);
|
test_verify_koji(artist);
|
||||||
|
|
||||||
file_init(&f, "artist_tag", 0);
|
file_init(&f, "artist_tag", 0);
|
||||||
|
@ -50,8 +52,11 @@ static void test_artist()
|
||||||
|
|
||||||
static void test_artist_compare()
|
static void test_artist_compare()
|
||||||
{
|
{
|
||||||
struct artist *koji = new struct artist("Koji Kondo");
|
const struct db_ops *artist_ops = test_artist_ops();
|
||||||
struct artist *hajime = new struct artist("hajime wakai");
|
struct artist *koji, *hajime;
|
||||||
|
|
||||||
|
koji = (struct artist *)artist_ops->dbe_alloc("Koji Kondo");
|
||||||
|
hajime = (struct artist *)artist_ops->dbe_alloc("hajime wakai");
|
||||||
|
|
||||||
test_equal(artist_compare(koji, koji), 0);
|
test_equal(artist_compare(koji, koji), 0);
|
||||||
test_equal(artist_compare(koji, hajime), 1);
|
test_equal(artist_compare(koji, hajime), 1);
|
||||||
|
|
|
@ -20,10 +20,12 @@ static void test_verify_vg(struct genre *genre)
|
||||||
|
|
||||||
static void test_genre()
|
static void test_genre()
|
||||||
{
|
{
|
||||||
struct genre *genre = new struct genre("Video Game Music");
|
const struct db_ops *genre_ops = test_genre_ops();
|
||||||
|
struct genre *genre;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
file f;
|
file f;
|
||||||
|
|
||||||
|
genre = (struct genre *)genre_ops->dbe_alloc("Video Game Music");
|
||||||
test_verify_vg(genre);
|
test_verify_vg(genre);
|
||||||
|
|
||||||
file_init(&f, "genre_tag", 0);
|
file_init(&f, "genre_tag", 0);
|
||||||
|
@ -50,8 +52,11 @@ static void test_genre()
|
||||||
|
|
||||||
static void test_genre_compare()
|
static void test_genre_compare()
|
||||||
{
|
{
|
||||||
struct genre *video = new struct genre("Video Game Music");
|
const struct db_ops *genre_ops = test_genre_ops();
|
||||||
struct genre *game = new struct genre("game music");
|
struct genre *video, *game;
|
||||||
|
|
||||||
|
video = (struct genre *)genre_ops->dbe_alloc("Video Game Music");
|
||||||
|
game = (struct genre *)genre_ops->dbe_alloc("game music");
|
||||||
|
|
||||||
test_equal(genre_compare(video, video), 0);
|
test_equal(genre_compare(video, video), 0);
|
||||||
test_equal(genre_compare(video, game), 1);
|
test_equal(genre_compare(video, game), 1);
|
||||||
|
|
|
@ -27,11 +27,13 @@ static void test_verify_link(struct library *library)
|
||||||
|
|
||||||
static void test_library()
|
static void test_library()
|
||||||
{
|
{
|
||||||
struct library *link = new struct library("/home/Link/Music");
|
const struct db_ops *library_ops = test_library_ops();
|
||||||
struct library *zelda = new struct library("/home/Zelda/Music");
|
struct library *link, *zelda, *library = new struct library();
|
||||||
struct library *library = new struct library();
|
|
||||||
file f;
|
file f;
|
||||||
|
|
||||||
|
link = (struct library *)library_ops->dbe_alloc("/home/Link/Music");
|
||||||
|
zelda = (struct library *)library_ops->dbe_alloc("/home/Zelda/Music");
|
||||||
|
|
||||||
library_set_enabled(link, false);
|
library_set_enabled(link, false);
|
||||||
test_verify_link(link);
|
test_verify_link(link);
|
||||||
test_verify_zelda(zelda);
|
test_verify_zelda(zelda);
|
||||||
|
|
Loading…
Reference in New Issue