core/database: Move db_load() out of the database struct

Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
Anna Schumaker 2015-09-17 08:12:25 -04:00
parent 3a74cb0aa5
commit 8486fc6111
15 changed files with 35 additions and 41 deletions

View File

@ -87,7 +87,7 @@ void playlist :: init()
{ {
std::set<unsigned int>::iterator it; std::set<unsigned int>::iterator it;
playlist_db.load(); db_load(&playlist_db);
IndexEntry *ent = get_tracks("Banned"); IndexEntry *ent = get_tracks("Banned");
if (!ent) if (!ent)

View File

@ -50,7 +50,7 @@ unsigned int Album :: year()
void tags :: init_album_db() void tags :: init_album_db()
{ {
album_db.load(); db_load(&album_db);
} }
Album *tags :: get_album(const std::string &name, unsigned int year) Album *tags :: get_album(const std::string &name, unsigned int year)

View File

@ -17,7 +17,7 @@ Artist :: Artist(const std::string &name)
void tags :: init_artist_db() void tags :: init_artist_db()
{ {
artist_db.load(); db_load(&artist_db);
} }
Artist *tags :: get_artist(const std::string &name) Artist *tags :: get_artist(const std::string &name)

View File

@ -17,7 +17,7 @@ Genre :: Genre(const std::string &name)
void tags :: init_genre_db() void tags :: init_genre_db()
{ {
genre_db.load(); db_load(&genre_db);
} }
Genre *tags :: get_genre(const std::string &name) Genre *tags :: get_genre(const std::string &name)

View File

@ -69,7 +69,7 @@ void Library :: dec_size()
void tags :: init_library_db() void tags :: init_library_db()
{ {
library_db.load(); db_load(&library_db);
} }
Library *tags :: get_library(const std::string &path) Library *tags :: get_library(const std::string &path)

View File

@ -140,7 +140,7 @@ void Track :: write(file &file)
void tags :: init_track_db() void tags :: init_track_db()
{ {
track_db.load(); db_load(&track_db);
} }
Track *tags :: add_track(Album *album, Artist *artist, Genre *genre, Track *tags :: add_track(Album *album, Artist *artist, Genre *genre,

View File

@ -12,18 +12,14 @@ extern "C" {
#include <string> #include <string>
#include <vector> #include <vector>
template<class T> struct database;
/** /**
* The DatabaseEntry class is the base class for storing * The DatabaseEntry class is the base class for storing
* generic data inside a Database. * generic data inside a Database.
*/ */
class DatabaseEntry { class DatabaseEntry {
private: public:
template <class T> friend struct database;
unsigned int _index; /**< The location of an item in the Database. */ unsigned int _index; /**< The location of an item in the Database. */
public:
DatabaseEntry(); /**< Initialize _index to 0. */ DatabaseEntry(); /**< Initialize _index to 0. */
virtual ~DatabaseEntry() = 0; /**< Virtual destructor */ virtual ~DatabaseEntry() = 0; /**< Virtual destructor */
@ -122,10 +118,6 @@ struct database {
*/ */
void autosave(); void autosave();
/**
* Called to read the Database from disk.
*/
void load();
/** /**
@ -193,6 +185,10 @@ struct database {
}; };
/* Called to read the database from disk. */
template <class T>
void db_load(struct database<T> *);
/* Returns the size of the backing std::vector. */ /* Returns the size of the backing std::vector. */
template <class T> template <class T>
unsigned int db_actual_size(const struct database<T> *); unsigned int db_actual_size(const struct database<T> *);

View File

@ -50,34 +50,32 @@ void database<T> :: autosave()
} }
template <class T> template <class T>
void database<T> :: load() void db_load(struct database<T> *db)
{ {
unsigned int size; unsigned int size;
std::string str; std::string str;
int valid; int valid;
if (file_exists(&db_file) == false) if (file_open(&db->db_file, OPEN_READ) == false)
return;
else if (file_open(&db_file, OPEN_READ) == false)
return; return;
file_readf(&db_file, "%u", &size); file_readf(&db->db_file, "%u", &size);
db_entries.resize(size); db->db_entries.resize(size);
for (unsigned int i = 0; i < size; i++) { for (unsigned int i = 0; i < size; i++) {
file_readf(&db_file, "%d", &valid); file_readf(&db->db_file, "%d", &valid);
if (valid == false) { if (valid == false) {
db_entries[i] = NULL; db->db_entries[i] = NULL;
} else { } else {
db_entries[i] = new T; db->db_entries[i] = new T;
db_entries[i]->_index = i; db->db_entries[i]->_index = i;
db_entries[i]->read(db_file); db->db_entries[i]->read(db->db_file);
str = db_entries[i]->primary_key(); str = db->db_entries[i]->primary_key();
db_keys[str] = i; db->db_keys[str] = i;
db_size++; db->db_size++;
} }
} }
file_close(&db_file); file_close(&db->db_file);
} }
template <class T> template <class T>

View File

@ -153,7 +153,7 @@ static void test_save_load()
for (i = 0; i < N; i++) for (i = 0; i < N; i++)
db1.insert(int_entry(i)); db1.insert(int_entry(i));
db2.load(); db_load(&db2);
test_equal(db2.db_size, N); test_equal(db2.db_size, N);
test_equal(db_actual_size(&db2), N); test_equal(db_actual_size(&db2), N);
for (i = 0; i < N; i++) { for (i = 0; i < N; i++) {
@ -167,7 +167,7 @@ static void test_save_load()
db1.remove(i); db1.remove(i);
db2 = database<struct int_entry>("save_load.db", false); db2 = database<struct int_entry>("save_load.db", false);
db2.load(); db_load(&db2);
test_equal(db2.db_size, N / 2); test_equal(db2.db_size, N / 2);
for (i = 1; i < N; i++) { for (i = 1; i < N; i++) {
dbe = db2.at(i); dbe = db2.at(i);
@ -186,12 +186,12 @@ static void test_save_load()
db2.remove(i); db2.remove(i);
db1 = database<struct int_entry>("save_load.db", false); db1 = database<struct int_entry>("save_load.db", false);
db1.load(); db_load(&db1);
test_equal(db1.db_size, N / 2); test_equal(db1.db_size, N / 2);
db2.save(); db2.save();
db1 = database<struct int_entry>("save_load.db", false); db1 = database<struct int_entry>("save_load.db", false);
db1.load(); db_load(&db1);
test_equal(db1.db_size, N); test_equal(db1.db_size, N);
test_equal(db_actual_size(&db1), 2 * N); test_equal(db_actual_size(&db1), 2 * N);

View File

@ -77,11 +77,11 @@ static void test_save_load(unsigned int n)
Index idx2("index.idx", false); Index idx2("index.idx", false);
IndexEntry *it1, *it2; IndexEntry *it1, *it2;
idx2.load(); db_load(&idx2);
test_equal(idx2.db_size, (unsigned)0); test_equal(idx2.db_size, (unsigned)0);
INDEX->save(); INDEX->save();
idx2.load(); db_load(&idx2);
test_equal(idx2.db_size, INDEX->db_size); test_equal(idx2.db_size, INDEX->db_size);
test_equal(db_actual_size(&idx2), db_actual_size(INDEX)); test_equal(db_actual_size(&idx2), db_actual_size(INDEX));

View File

@ -49,7 +49,7 @@ static void test_album_tag_lookup()
test_equal(tags :: get_album(0), album); test_equal(tags :: get_album(0), album);
test_equal(tags :: get_album(1), (Album *)NULL); test_equal(tags :: get_album(1), (Album *)NULL);
album_db.load(); db_load(&album_db);
test_equal(album_db.db_size, (unsigned)1); test_equal(album_db.db_size, (unsigned)1);
} }

View File

@ -30,7 +30,7 @@ static void test_artist_tag_lookup()
test_equal(tags :: get_artist(0), artist); test_equal(tags :: get_artist(0), artist);
test_equal(tags :: get_artist(1), (Artist *)NULL); test_equal(tags :: get_artist(1), (Artist *)NULL);
artist_db.load(); db_load(&artist_db);
test_equal(artist_db.db_size, (unsigned)1); test_equal(artist_db.db_size, (unsigned)1);
} }

View File

@ -30,7 +30,7 @@ static void test_genere_tag_lookup()
test_equal(tags :: get_genre(0), genre); test_equal(tags :: get_genre(0), genre);
test_equal(tags :: get_genre(1), (Genre *)NULL); test_equal(tags :: get_genre(1), (Genre *)NULL);
genre_db.load(); db_load(&genre_db);
test_equal(genre_db.db_size, (unsigned)1); test_equal(genre_db.db_size, (unsigned)1);
} }

View File

@ -58,7 +58,7 @@ static void test_library_tag_lookup()
test_equal(tags :: get_library(0), library); test_equal(tags :: get_library(0), library);
test_equal(tags :: get_library(1), (Library *)NULL); test_equal(tags :: get_library(1), (Library *)NULL);
library_db.load(); db_load(&library_db);
test_equal(db_actual_size(&library_db), (unsigned)tags :: library_size()); test_equal(db_actual_size(&library_db), (unsigned)tags :: library_size());
tags :: remove_library(library); tags :: remove_library(library);

View File

@ -108,7 +108,7 @@ static void test_track_tag_destructor()
static void test_track_tag_load_db(unsigned int size) static void test_track_tag_load_db(unsigned int size)
{ {
database<Track> track_db("track.db", false); database<Track> track_db("track.db", false);
track_db.load(); db_load(&track_db);
test_equal(track_db.db_size, size); test_equal(track_db.db_size, size);
} }