summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Kellermann <max@musicpd.org>2016-10-29 09:45:34 +0200
committerMax Kellermann <max@musicpd.org>2016-10-29 09:45:34 +0200
commit90a14e14f457e7ec34dd8ff3dcfe710e2dd93208 (patch)
treed12ec940506c2a51fee437e5499ea248a99b7650
parentdea46e8d5a714a483aee8e14775eb8b3a69aa4ad (diff)
db/simple/Save: migrate from class Error to C++ exceptions
-rw-r--r--src/PlaylistDatabase.cxx27
-rw-r--r--src/PlaylistDatabase.hxx8
-rw-r--r--src/SongSave.cxx16
-rw-r--r--src/SongSave.hxx6
-rw-r--r--src/db/plugins/simple/DatabaseSave.cxx74
-rw-r--r--src/db/plugins/simple/DatabaseSave.hxx7
-rw-r--r--src/db/plugins/simple/DirectorySave.cxx78
-rw-r--r--src/db/plugins/simple/DirectorySave.hxx7
-rw-r--r--src/db/plugins/simple/SimpleDatabasePlugin.cxx20
-rw-r--r--src/db/plugins/simple/SimpleDatabasePlugin.hxx5
-rw-r--r--src/queue/QueueSave.cxx9
11 files changed, 93 insertions, 164 deletions
diff --git a/src/PlaylistDatabase.cxx b/src/PlaylistDatabase.cxx
index c0f756fc8..71b554db2 100644
--- a/src/PlaylistDatabase.cxx
+++ b/src/PlaylistDatabase.cxx
@@ -23,14 +23,11 @@
#include "fs/io/TextFile.hxx"
#include "fs/io/BufferedOutputStream.hxx"
#include "util/StringUtil.hxx"
-#include "util/Error.hxx"
-#include "util/Domain.hxx"
+#include "util/RuntimeError.hxx"
#include <string.h>
#include <stdlib.h>
-static constexpr Domain playlist_database_domain("playlist_database");
-
void
playlist_vector_save(BufferedOutputStream &os, const PlaylistVector &pv)
{
@@ -41,9 +38,8 @@ playlist_vector_save(BufferedOutputStream &os, const PlaylistVector &pv)
pi.name.c_str(), (long)pi.mtime);
}
-bool
-playlist_metadata_load(TextFile &file, PlaylistVector &pv, const char *name,
- Error &error)
+void
+playlist_metadata_load(TextFile &file, PlaylistVector &pv, const char *name)
{
PlaylistInfo pm(name, 0);
@@ -53,24 +49,19 @@ playlist_metadata_load(TextFile &file, PlaylistVector &pv, const char *name,
while ((line = file.ReadLine()) != nullptr &&
strcmp(line, "playlist_end") != 0) {
colon = strchr(line, ':');
- if (colon == nullptr || colon == line) {
- error.Format(playlist_database_domain,
- "unknown line in db: %s", line);
- return false;
- }
+ if (colon == nullptr || colon == line)
+ throw FormatRuntimeError("unknown line in db: %s",
+ line);
*colon++ = 0;
value = StripLeft(colon);
if (strcmp(line, "mtime") == 0)
pm.mtime = strtol(value, nullptr, 10);
- else {
- error.Format(playlist_database_domain,
- "unknown line in db: %s", line);
- return false;
- }
+ else
+ throw FormatRuntimeError("unknown line in db: %s",
+ line);
}
pv.UpdateOrInsert(std::move(pm));
- return true;
}
diff --git a/src/PlaylistDatabase.hxx b/src/PlaylistDatabase.hxx
index a87125c64..fd2be89b5 100644
--- a/src/PlaylistDatabase.hxx
+++ b/src/PlaylistDatabase.hxx
@@ -32,8 +32,10 @@ class Error;
void
playlist_vector_save(BufferedOutputStream &os, const PlaylistVector &pv);
-bool
-playlist_metadata_load(TextFile &file, PlaylistVector &pv, const char *name,
- Error &error);
+/**
+ * Throws #std::runtime_error on error.
+ */
+void
+playlist_metadata_load(TextFile &file, PlaylistVector &pv, const char *name);
#endif
diff --git a/src/SongSave.cxx b/src/SongSave.cxx
index d20ad4af1..265b3c286 100644
--- a/src/SongSave.cxx
+++ b/src/SongSave.cxx
@@ -27,8 +27,7 @@
#include "tag/Tag.hxx"
#include "tag/TagBuilder.hxx"
#include "util/StringUtil.hxx"
-#include "util/Error.hxx"
-#include "util/Domain.hxx"
+#include "util/RuntimeError.hxx"
#include <string.h>
#include <stdlib.h>
@@ -36,8 +35,6 @@
#define SONG_MTIME "mtime"
#define SONG_END "song_end"
-static constexpr Domain song_save_domain("song_save");
-
static void
range_save(BufferedOutputStream &os, unsigned start_ms, unsigned end_ms)
{
@@ -74,8 +71,7 @@ song_save(BufferedOutputStream &os, const DetachedSong &song)
}
DetachedSong *
-song_load(TextFile &file, const char *uri,
- Error &error)
+song_load(TextFile &file, const char *uri)
{
DetachedSong *song = new DetachedSong(uri);
@@ -88,9 +84,7 @@ song_load(TextFile &file, const char *uri,
if (colon == nullptr || colon == line) {
delete song;
- error.Format(song_save_domain,
- "unknown line in db: %s", line);
- return nullptr;
+ throw FormatRuntimeError("unknown line in db: %s", line);
}
*colon++ = 0;
@@ -118,9 +112,7 @@ song_load(TextFile &file, const char *uri,
} else {
delete song;
- error.Format(song_save_domain,
- "unknown line in db: %s", line);
- return nullptr;
+ throw FormatRuntimeError("unknown line in db: %s", line);
}
}
diff --git a/src/SongSave.hxx b/src/SongSave.hxx
index db59adb8c..5c29fbfd9 100644
--- a/src/SongSave.hxx
+++ b/src/SongSave.hxx
@@ -38,11 +38,9 @@ song_save(BufferedOutputStream &os, const DetachedSong &song);
* Loads a song from the input file. Reading stops after the
* "song_end" line.
*
- * @param error location to store the error occurring
- * @return true on success, false on error
+ * Throws #std::runtime_error on error.
*/
DetachedSong *
-song_load(TextFile &file, const char *uri,
- Error &error);
+song_load(TextFile &file, const char *uri);
#endif
diff --git a/src/db/plugins/simple/DatabaseSave.cxx b/src/db/plugins/simple/DatabaseSave.cxx
index fa39164bb..5b93438f9 100644
--- a/src/db/plugins/simple/DatabaseSave.cxx
+++ b/src/db/plugins/simple/DatabaseSave.cxx
@@ -29,7 +29,7 @@
#include "tag/Settings.hxx"
#include "fs/Charset.hxx"
#include "util/StringCompare.hxx"
-#include "util/Error.hxx"
+#include "util/RuntimeError.hxx"
#include "Log.hxx"
#include <string.h>
@@ -66,8 +66,8 @@ db_save_internal(BufferedOutputStream &os, const Directory &music_root)
directory_save(os, music_root);
}
-bool
-db_load_internal(TextFile &file, Directory &music_root, Error &error)
+void
+db_load_internal(TextFile &file, Directory &music_root)
{
char *line;
unsigned format = 0;
@@ -76,10 +76,8 @@ db_load_internal(TextFile &file, Directory &music_root, Error &error)
/* get initial info */
line = file.ReadLine();
- if (line == nullptr || strcmp(DIRECTORY_INFO_BEGIN, line) != 0) {
- error.Set(db_domain, "Database corrupted");
- return false;
- }
+ if (line == nullptr || strcmp(DIRECTORY_INFO_BEGIN, line) != 0)
+ throw std::runtime_error("Database corrupted");
memset(tags, false, sizeof(tags));
@@ -90,67 +88,49 @@ db_load_internal(TextFile &file, Directory &music_root, Error &error)
if ((p = StringAfterPrefix(line, DB_FORMAT_PREFIX))) {
format = atoi(p);
} else if (StringStartsWith(line, DIRECTORY_MPD_VERSION)) {
- if (found_version) {
- error.Set(db_domain, "Duplicate version line");
- return false;
- }
+ if (found_version)
+ throw std::runtime_error("Duplicate version line");
found_version = true;
} else if ((p = StringAfterPrefix(line, DIRECTORY_FS_CHARSET))) {
- if (found_charset) {
- error.Set(db_domain, "Duplicate charset line");
- return false;
- }
+ if (found_charset)
+ throw std::runtime_error("Duplicate charset line");
found_charset = true;
const char *new_charset = p;
const char *const old_charset = GetFSCharset();
if (*old_charset != 0
- && strcmp(new_charset, old_charset) != 0) {
- error.Format(db_domain,
- "Existing database has charset "
- "\"%s\" instead of \"%s\"; "
- "discarding database file",
- new_charset, old_charset);
- return false;
- }
+ && strcmp(new_charset, old_charset) != 0)
+ throw FormatRuntimeError("Existing database has charset "
+ "\"%s\" instead of \"%s\"; "
+ "discarding database file",
+ new_charset, old_charset);
} else if ((p = StringAfterPrefix(line, DB_TAG_PREFIX))) {
const char *name = p;
TagType tag = tag_name_parse(name);
- if (tag == TAG_NUM_OF_ITEM_TYPES) {
- error.Format(db_domain,
- "Unrecognized tag '%s', "
- "discarding database file",
- name);
- return false;
- }
+ if (tag == TAG_NUM_OF_ITEM_TYPES)
+ throw FormatRuntimeError("Unrecognized tag '%s', "
+ "discarding database file",
+ name);
tags[tag] = true;
} else {
- error.Format(db_domain, "Malformed line: %s", line);
- return false;
+ throw FormatRuntimeError("Malformed line: %s", line);
}
}
- if (format < OLDEST_DB_FORMAT || format > DB_FORMAT) {
- error.Set(db_domain,
- "Database format mismatch, "
- "discarding database file");
- return false;
- }
+ if (format < OLDEST_DB_FORMAT || format > DB_FORMAT)
+ throw std::runtime_error("Database format mismatch, "
+ "discarding database file");
- for (unsigned i = 0; i < TAG_NUM_OF_ITEM_TYPES; ++i) {
- if (IsTagEnabled(i) && !tags[i]) {
- error.Set(db_domain,
- "Tag list mismatch, "
- "discarding database file");
- return false;
- }
- }
+ for (unsigned i = 0; i < TAG_NUM_OF_ITEM_TYPES; ++i)
+ if (IsTagEnabled(i) && !tags[i])
+ throw std::runtime_error("Tag list mismatch, "
+ "discarding database file");
LogDebug(db_domain, "reading DB");
const ScopeDatabaseLock protect;
- return directory_load(file, music_root, error);
+ directory_load(file, music_root);
}
diff --git a/src/db/plugins/simple/DatabaseSave.hxx b/src/db/plugins/simple/DatabaseSave.hxx
index 32929a14e..dd5341d32 100644
--- a/src/db/plugins/simple/DatabaseSave.hxx
+++ b/src/db/plugins/simple/DatabaseSave.hxx
@@ -28,7 +28,10 @@ class Error;
void
db_save_internal(BufferedOutputStream &os, const Directory &root);
-bool
-db_load_internal(TextFile &file, Directory &root, Error &error);
+/**
+ * Throws #std::runtime_error on error.
+ */
+void
+db_load_internal(TextFile &file, Directory &root);
#endif
diff --git a/src/db/plugins/simple/DirectorySave.cxx b/src/db/plugins/simple/DirectorySave.cxx
index 83664eb4f..27c602d11 100644
--- a/src/db/plugins/simple/DirectorySave.cxx
+++ b/src/db/plugins/simple/DirectorySave.cxx
@@ -28,8 +28,7 @@
#include "fs/io/BufferedOutputStream.hxx"
#include "util/StringCompare.hxx"
#include "util/NumberParser.hxx"
-#include "util/Error.hxx"
-#include "util/Domain.hxx"
+#include "util/RuntimeError.hxx"
#include <string.h>
@@ -39,8 +38,6 @@
#define DIRECTORY_BEGIN "begin: "
#define DIRECTORY_END "end: "
-static constexpr Domain directory_domain("directory");
-
gcc_const
static const char *
DeviceToTypeString(unsigned device)
@@ -115,49 +112,37 @@ ParseLine(Directory &directory, const char *line)
}
static Directory *
-directory_load_subdir(TextFile &file, Directory &parent, const char *name,
- Error &error)
+directory_load_subdir(TextFile &file, Directory &parent, const char *name)
{
- bool success;
-
- if (parent.FindChild(name) != nullptr) {
- error.Format(directory_domain,
- "Duplicate subdirectory '%s'", name);
- return nullptr;
- }
+ if (parent.FindChild(name) != nullptr)
+ throw FormatRuntimeError("Duplicate subdirectory '%s'", name);
Directory *directory = parent.CreateChild(name);
- while (true) {
- const char *line = file.ReadLine();
- if (line == nullptr) {
- error.Set(directory_domain, "Unexpected end of file");
- directory->Delete();
- return nullptr;
- }
+ try {
+ while (true) {
+ const char *line = file.ReadLine();
+ if (line == nullptr)
+ throw std::runtime_error("Unexpected end of file");
- if (StringStartsWith(line, DIRECTORY_BEGIN))
- break;
+ if (StringStartsWith(line, DIRECTORY_BEGIN))
+ break;
- if (!ParseLine(*directory, line)) {
- error.Format(directory_domain,
- "Malformed line: %s", line);
- directory->Delete();
- return nullptr;
+ if (!ParseLine(*directory, line))
+ throw FormatRuntimeError("Malformed line: %s", line);
}
- }
- success = directory_load(file, *directory, error);
- if (!success) {
+ directory_load(file, *directory);
+ } catch (...) {
directory->Delete();
- return nullptr;
+ throw;
}
return directory;
}
-bool
-directory_load(TextFile &file, Directory &directory, Error &error)
+void
+directory_load(TextFile &file, Directory &directory)
{
const char *line;
@@ -165,38 +150,23 @@ directory_load(TextFile &file, Directory &directory, Error &error)
!StringStartsWith(line, DIRECTORY_END)) {
const char *p;
if ((p = StringAfterPrefix(line, DIRECTORY_DIR))) {
- Directory *subdir =
- directory_load_subdir(file, directory,
- p, error);
- if (subdir == nullptr)
- return false;
+ directory_load_subdir(file, directory, p);
} else if ((p = StringAfterPrefix(line, SONG_BEGIN))) {
const char *name = p;
- if (directory.FindSong(name) != nullptr) {
- error.Format(directory_domain,
- "Duplicate song '%s'", name);
- return false;
- }
+ if (directory.FindSong(name) != nullptr)
+ throw FormatRuntimeError("Duplicate song '%s'", name);
- DetachedSong *song = song_load(file, name, error);
- if (song == nullptr)
- return false;
+ DetachedSong *song = song_load(file, name);
directory.AddSong(Song::NewFrom(std::move(*song),
directory));
delete song;
} else if ((p = StringAfterPrefix(line, PLAYLIST_META_BEGIN))) {
const char *name = p;
- if (!playlist_metadata_load(file, directory.playlists,
- name, error))
- return false;
+ playlist_metadata_load(file, directory.playlists, name);
} else {
- error.Format(directory_domain,
- "Malformed line: %s", line);
- return false;
+ throw FormatRuntimeError("Malformed line: %s", line);
}
}
-
- return true;
}
diff --git a/src/db/plugins/simple/DirectorySave.hxx b/src/db/plugins/simple/DirectorySave.hxx
index 6bb781c48..3737710f9 100644
--- a/src/db/plugins/simple/DirectorySave.hxx
+++ b/src/db/plugins/simple/DirectorySave.hxx
@@ -28,7 +28,10 @@ class Error;
void
directory_save(BufferedOutputStream &os, const Directory &directory);
-bool
-directory_load(TextFile &file, Directory &directory, Error &error);
+/**
+ * Throws #std::runtime_error on error.
+ */
+void
+directory_load(TextFile &file, Directory &directory);
#endif
diff --git a/src/db/plugins/simple/SimpleDatabasePlugin.cxx b/src/db/plugins/simple/SimpleDatabasePlugin.cxx
index 768abc57c..54d9372de 100644
--- a/src/db/plugins/simple/SimpleDatabasePlugin.cxx
+++ b/src/db/plugins/simple/SimpleDatabasePlugin.cxx
@@ -142,22 +142,19 @@ SimpleDatabase::Check() const
#endif
}
-bool
-SimpleDatabase::Load(Error &error)
+void
+SimpleDatabase::Load()
{
assert(!path.IsNull());
assert(root != nullptr);
TextFile file(path);
- if (!db_load_internal(file, *root, error))
- return false;
+ db_load_internal(file, *root);
FileInfo fi;
if (GetFileInfo(path, fi))
mtime = fi.GetModificationTime();
-
- return true;
}
void
@@ -173,16 +170,7 @@ SimpleDatabase::Open()
#endif
try {
- Error error2;
- if (!Load(error2)) {
- LogError(error2);
-
- delete root;
-
- Check();
-
- root = Directory::NewRoot();
- }
+ Load();
} catch (const std::exception &e) {
LogError(e);
diff --git a/src/db/plugins/simple/SimpleDatabasePlugin.hxx b/src/db/plugins/simple/SimpleDatabasePlugin.hxx
index 40815f2c1..0d96fdbba 100644
--- a/src/db/plugins/simple/SimpleDatabasePlugin.hxx
+++ b/src/db/plugins/simple/SimpleDatabasePlugin.hxx
@@ -136,7 +136,10 @@ private:
void Check() const;
- bool Load(Error &error);
+ /**
+ * Throws #std::runtime_error on error.
+ */
+ void Load();
Database *LockUmountSteal(const char *uri);
};
diff --git a/src/queue/QueueSave.cxx b/src/queue/QueueSave.cxx
index a67172795..f1fa89497 100644
--- a/src/queue/QueueSave.cxx
+++ b/src/queue/QueueSave.cxx
@@ -27,7 +27,6 @@
#include "fs/io/TextFile.hxx"
#include "fs/io/BufferedOutputStream.hxx"
#include "util/StringCompare.hxx"
-#include "util/Error.hxx"
#include "Log.hxx"
#include <stdlib.h>
@@ -95,10 +94,10 @@ queue_load_song(TextFile &file, const SongLoader &loader,
if ((p = StringAfterPrefix(line, SONG_BEGIN))) {
const char *uri = p;
- Error error;
- song = song_load(file, uri, error);
- if (song == nullptr) {
- LogError(error);
+ try {
+ song = song_load(file, uri);
+ } catch (const std::runtime_error &e) {
+ LogError(e);
return;
}
} else {