StickerDatabase: return std::string

This commit is contained in:
Max Kellermann 2013-10-17 19:37:51 +02:00
parent e452d1f5b4
commit c85af12d45
5 changed files with 26 additions and 23 deletions

View File

@ -28,7 +28,7 @@
#include <assert.h> #include <assert.h>
#include <string.h> #include <string.h>
char * std::string
sticker_song_get_value(const Song *song, const char *name) sticker_song_get_value(const Song *song, const char *name)
{ {
assert(song != NULL); assert(song != NULL);

View File

@ -20,6 +20,10 @@
#ifndef MPD_SONG_STICKER_HXX #ifndef MPD_SONG_STICKER_HXX
#define MPD_SONG_STICKER_HXX #define MPD_SONG_STICKER_HXX
#include "Compiler.h"
#include <string>
struct Song; struct Song;
struct Directory; struct Directory;
struct sticker; struct sticker;
@ -28,7 +32,8 @@ struct sticker;
* Returns one value from a song's sticker record. The caller must * Returns one value from a song's sticker record. The caller must
* free the return value with g_free(). * free the return value with g_free().
*/ */
char * gcc_pure
std::string
sticker_song_get_value(const Song *song, const char *name); sticker_song_get_value(const Song *song, const char *name);
/** /**

View File

@ -65,16 +65,15 @@ handle_sticker_song(Client *client, int argc, char *argv[])
if (song == nullptr) if (song == nullptr)
return print_error(client, error); 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); db->ReturnSong(song);
if (value == NULL) { if (value.empty()) {
command_error(client, ACK_ERROR_NO_EXIST, command_error(client, ACK_ERROR_NO_EXIST,
"no such sticker"); "no such sticker");
return COMMAND_RETURN_ERROR; return COMMAND_RETURN_ERROR;
} }
sticker_print_value(client, argv[4], value); sticker_print_value(client, argv[4], value.c_str());
g_free(value);
return COMMAND_RETURN_OK; return COMMAND_RETURN_OK;
/* list song song_id */ /* list song song_id */

View File

@ -29,7 +29,6 @@
#include <string> #include <string>
#include <map> #include <map>
#include <glib.h>
#include <sqlite3.h> #include <sqlite3.h>
#include <assert.h> #include <assert.h>
@ -172,12 +171,11 @@ sticker_enabled(void)
return sticker_db != NULL; return sticker_db != NULL;
} }
char * std::string
sticker_load_value(const char *type, const char *uri, const char *name) sticker_load_value(const char *type, const char *uri, const char *name)
{ {
sqlite3_stmt *const stmt = sticker_stmt[STICKER_SQL_GET]; sqlite3_stmt *const stmt = sticker_stmt[STICKER_SQL_GET];
int ret; int ret;
char *value;
assert(sticker_enabled()); assert(sticker_enabled());
assert(type != NULL); assert(type != NULL);
@ -185,42 +183,41 @@ sticker_load_value(const char *type, const char *uri, const char *name)
assert(name != NULL); assert(name != NULL);
if (*name == 0) if (*name == 0)
return NULL; return std::string();
sqlite3_reset(stmt); sqlite3_reset(stmt);
ret = sqlite3_bind_text(stmt, 1, type, -1, NULL); ret = sqlite3_bind_text(stmt, 1, type, -1, NULL);
if (ret != SQLITE_OK) { if (ret != SQLITE_OK) {
LogError(sticker_db, "sqlite3_bind_text() failed"); LogError(sticker_db, "sqlite3_bind_text() failed");
return NULL; return std::string();
} }
ret = sqlite3_bind_text(stmt, 2, uri, -1, NULL); ret = sqlite3_bind_text(stmt, 2, uri, -1, NULL);
if (ret != SQLITE_OK) { if (ret != SQLITE_OK) {
LogError(sticker_db, "sqlite3_bind_text() failed"); LogError(sticker_db, "sqlite3_bind_text() failed");
return NULL; return std::string();
} }
ret = sqlite3_bind_text(stmt, 3, name, -1, NULL); ret = sqlite3_bind_text(stmt, 3, name, -1, NULL);
if (ret != SQLITE_OK) { if (ret != SQLITE_OK) {
LogError(sticker_db, "sqlite3_bind_text() failed"); LogError(sticker_db, "sqlite3_bind_text() failed");
return NULL; return std::string();
} }
do { do {
ret = sqlite3_step(stmt); ret = sqlite3_step(stmt);
} while (ret == SQLITE_BUSY); } while (ret == SQLITE_BUSY);
std::string value;
if (ret == SQLITE_ROW) { if (ret == SQLITE_ROW) {
/* record found */ /* 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) { } else if (ret == SQLITE_DONE) {
/* no record found */ /* no record found */
value = NULL;
} else { } else {
/* error */ /* error */
LogError(sticker_db, "sqlite3_step() failed"); LogError(sticker_db, "sqlite3_step() failed");
return NULL;
} }
sqlite3_reset(stmt); sqlite3_reset(stmt);
@ -523,8 +520,8 @@ sticker_get_value(const struct sticker *sticker, const char *name)
void void
sticker_foreach(const struct sticker *sticker, sticker_foreach(const struct sticker *sticker,
void (*func)(const char *name, const char *value, void (*func)(const char *name, const char *value,
gpointer user_data), void *user_data),
gpointer user_data) void *user_data)
{ {
for (const auto &i : sticker->table) for (const auto &i : sticker->table)
func(i.first.c_str(), i.second.c_str(), user_data); func(i.first.c_str(), i.second.c_str(), user_data);
@ -548,8 +545,8 @@ sticker_load(const char *type, const char *uri)
bool bool
sticker_find(const char *type, const char *base_uri, const char *name, sticker_find(const char *type, const char *base_uri, const char *name,
void (*func)(const char *uri, const char *value, void (*func)(const char *uri, const char *value,
gpointer user_data), void *user_data),
gpointer user_data) void *user_data)
{ {
sqlite3_stmt *const stmt = sticker_stmt[STICKER_SQL_FIND]; sqlite3_stmt *const stmt = sticker_stmt[STICKER_SQL_FIND];
int ret; int ret;

View File

@ -44,6 +44,8 @@
#include "Compiler.h" #include "Compiler.h"
#include <string>
class Error; class Error;
class Path; class Path;
struct sticker; struct sticker;
@ -72,10 +74,10 @@ bool
sticker_enabled(void); sticker_enabled(void);
/** /**
* Returns one value from an object's sticker record. The caller must * Returns one value from an object's sticker record. Returns an
* free the return value with g_free(). * empty string if the value doesn't exist.
*/ */
char * std::string
sticker_load_value(const char *type, const char *uri, const char *name); sticker_load_value(const char *type, const char *uri, const char *name);
/** /**