From c85af12d45928aecb20a087a009e1f5f19f980e2 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 17 Oct 2013 19:37:51 +0200 Subject: StickerDatabase: return std::string --- src/SongSticker.cxx | 2 +- src/SongSticker.hxx | 7 ++++++- src/StickerCommands.cxx | 7 +++---- src/StickerDatabase.cxx | 25 +++++++++++-------------- src/StickerDatabase.hxx | 8 +++++--- 5 files changed, 26 insertions(+), 23 deletions(-) (limited to 'src') diff --git a/src/SongSticker.cxx b/src/SongSticker.cxx index 141e286b5..4932e0ef8 100644 --- a/src/SongSticker.cxx +++ b/src/SongSticker.cxx @@ -28,7 +28,7 @@ #include #include -char * +std::string sticker_song_get_value(const Song *song, const char *name) { assert(song != NULL); diff --git a/src/SongSticker.hxx b/src/SongSticker.hxx index 0f3e0bf41..f3b818de4 100644 --- a/src/SongSticker.hxx +++ b/src/SongSticker.hxx @@ -20,6 +20,10 @@ #ifndef MPD_SONG_STICKER_HXX #define MPD_SONG_STICKER_HXX +#include "Compiler.h" + +#include + struct Song; struct Directory; struct sticker; @@ -28,7 +32,8 @@ struct sticker; * Returns one value from a song's sticker record. The caller must * free the return value with g_free(). */ -char * +gcc_pure +std::string sticker_song_get_value(const Song *song, const char *name); /** diff --git a/src/StickerCommands.cxx b/src/StickerCommands.cxx index 5fdc0ba15..4c2152789 100644 --- a/src/StickerCommands.cxx +++ b/src/StickerCommands.cxx @@ -65,16 +65,15 @@ handle_sticker_song(Client *client, int argc, char *argv[]) if (song == nullptr) return print_error(client, error); - char *value = sticker_song_get_value(song, argv[4]); + const auto value = sticker_song_get_value(song, argv[4]); db->ReturnSong(song); - if (value == NULL) { + if (value.empty()) { command_error(client, ACK_ERROR_NO_EXIST, "no such sticker"); return COMMAND_RETURN_ERROR; } - sticker_print_value(client, argv[4], value); - g_free(value); + sticker_print_value(client, argv[4], value.c_str()); return COMMAND_RETURN_OK; /* list song song_id */ diff --git a/src/StickerDatabase.cxx b/src/StickerDatabase.cxx index 21bf7706f..84aa4c1e0 100644 --- a/src/StickerDatabase.cxx +++ b/src/StickerDatabase.cxx @@ -29,7 +29,6 @@ #include #include -#include #include #include @@ -172,12 +171,11 @@ sticker_enabled(void) return sticker_db != NULL; } -char * +std::string sticker_load_value(const char *type, const char *uri, const char *name) { sqlite3_stmt *const stmt = sticker_stmt[STICKER_SQL_GET]; int ret; - char *value; assert(sticker_enabled()); assert(type != NULL); @@ -185,42 +183,41 @@ sticker_load_value(const char *type, const char *uri, const char *name) assert(name != NULL); if (*name == 0) - return NULL; + return std::string(); sqlite3_reset(stmt); ret = sqlite3_bind_text(stmt, 1, type, -1, NULL); if (ret != SQLITE_OK) { LogError(sticker_db, "sqlite3_bind_text() failed"); - return NULL; + return std::string(); } ret = sqlite3_bind_text(stmt, 2, uri, -1, NULL); if (ret != SQLITE_OK) { LogError(sticker_db, "sqlite3_bind_text() failed"); - return NULL; + return std::string(); } ret = sqlite3_bind_text(stmt, 3, name, -1, NULL); if (ret != SQLITE_OK) { LogError(sticker_db, "sqlite3_bind_text() failed"); - return NULL; + return std::string(); } do { ret = sqlite3_step(stmt); } while (ret == SQLITE_BUSY); + std::string value; if (ret == SQLITE_ROW) { /* record found */ - value = g_strdup((const char*)sqlite3_column_text(stmt, 0)); + value = (const char*)sqlite3_column_text(stmt, 0); } else if (ret == SQLITE_DONE) { /* no record found */ - value = NULL; } else { /* error */ LogError(sticker_db, "sqlite3_step() failed"); - return NULL; } sqlite3_reset(stmt); @@ -523,8 +520,8 @@ sticker_get_value(const struct sticker *sticker, const char *name) void sticker_foreach(const struct sticker *sticker, void (*func)(const char *name, const char *value, - gpointer user_data), - gpointer user_data) + void *user_data), + void *user_data) { for (const auto &i : sticker->table) func(i.first.c_str(), i.second.c_str(), user_data); @@ -548,8 +545,8 @@ sticker_load(const char *type, const char *uri) bool sticker_find(const char *type, const char *base_uri, const char *name, void (*func)(const char *uri, const char *value, - gpointer user_data), - gpointer user_data) + void *user_data), + void *user_data) { sqlite3_stmt *const stmt = sticker_stmt[STICKER_SQL_FIND]; int ret; diff --git a/src/StickerDatabase.hxx b/src/StickerDatabase.hxx index 834d9a703..46a9ba52d 100644 --- a/src/StickerDatabase.hxx +++ b/src/StickerDatabase.hxx @@ -44,6 +44,8 @@ #include "Compiler.h" +#include + class Error; class Path; struct sticker; @@ -72,10 +74,10 @@ bool sticker_enabled(void); /** - * Returns one value from an object's sticker record. The caller must - * free the return value with g_free(). + * Returns one value from an object's sticker record. Returns an + * empty string if the value doesn't exist. */ -char * +std::string sticker_load_value(const char *type, const char *uri, const char *name); /** -- cgit v1.2.3