sticker/Song: add enum StickerOperator to sticker_song_find()
This commit is contained in:
parent
71ece56470
commit
fed44e95b3
@ -356,6 +356,7 @@ libmpd_a_SOURCES += \
|
||||
src/command/StickerCommands.cxx src/command/StickerCommands.hxx \
|
||||
src/lib/sqlite/Domain.cxx src/lib/sqlite/Domain.hxx \
|
||||
src/lib/sqlite/Util.hxx \
|
||||
src/sticker/Match.hxx \
|
||||
src/sticker/StickerDatabase.cxx src/sticker/StickerDatabase.hxx \
|
||||
src/sticker/StickerPrint.cxx src/sticker/StickerPrint.hxx \
|
||||
src/sticker/SongSticker.cxx src/sticker/SongSticker.hxx
|
||||
|
@ -143,6 +143,9 @@ handle_sticker_song(Client &client, ConstBuffer<const char *> args)
|
||||
|
||||
const char *const base_uri = args[2];
|
||||
|
||||
StickerOperator op = StickerOperator::EXISTS;
|
||||
const char *value = nullptr;
|
||||
|
||||
bool success;
|
||||
struct sticker_song_find_data data = {
|
||||
client,
|
||||
@ -150,6 +153,7 @@ handle_sticker_song(Client &client, ConstBuffer<const char *> args)
|
||||
};
|
||||
|
||||
success = sticker_song_find(*db, base_uri, data.name,
|
||||
op, value,
|
||||
sticker_song_find_print_cb, &data,
|
||||
error);
|
||||
if (!success) {
|
||||
|
31
src/sticker/Match.hxx
Normal file
31
src/sticker/Match.hxx
Normal file
@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright (C) 2003-2014 The Music Player Daemon Project
|
||||
* http://www.musicpd.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef MPD_STICKER_MATCH_HXX
|
||||
#define MPD_STICKER_MATCH_HXX
|
||||
|
||||
enum class StickerOperator {
|
||||
/**
|
||||
* Matches if a sticker with the specified name exists. The
|
||||
* "value" parameter is ignored (must be nullptr).
|
||||
*/
|
||||
EXISTS,
|
||||
};
|
||||
|
||||
#endif
|
@ -97,6 +97,7 @@ sticker_song_find_cb(const char *uri, const char *value, void *user_data)
|
||||
|
||||
bool
|
||||
sticker_song_find(const Database &db, const char *base_uri, const char *name,
|
||||
StickerOperator op, const char *value,
|
||||
void (*func)(const LightSong &song, const char *value,
|
||||
void *user_data),
|
||||
void *user_data,
|
||||
@ -119,7 +120,7 @@ sticker_song_find(const Database &db, const char *base_uri, const char *name,
|
||||
|
||||
data.base_uri_length = strlen(data.base_uri);
|
||||
|
||||
bool success = sticker_find("song", data.base_uri, name,
|
||||
bool success = sticker_find("song", data.base_uri, name, op, value,
|
||||
sticker_song_find_cb, &data,
|
||||
error);
|
||||
free(allocated);
|
||||
|
@ -20,6 +20,7 @@
|
||||
#ifndef MPD_SONG_STICKER_HXX
|
||||
#define MPD_SONG_STICKER_HXX
|
||||
|
||||
#include "Match.hxx"
|
||||
#include "Compiler.h"
|
||||
|
||||
#include <string>
|
||||
@ -30,7 +31,8 @@ class Database;
|
||||
class Error;
|
||||
|
||||
/**
|
||||
* Returns one value from a song's sticker record.
|
||||
* Returns one value from a song's sticker record. The caller must
|
||||
* free the return value with g_free().
|
||||
*/
|
||||
gcc_pure
|
||||
std::string
|
||||
@ -81,6 +83,7 @@ sticker_song_get(const LightSong &song, Error &error);
|
||||
*/
|
||||
bool
|
||||
sticker_song_find(const Database &db, const char *base_uri, const char *name,
|
||||
StickerOperator op, const char *value,
|
||||
void (*func)(const LightSong &song, const char *value,
|
||||
void *user_data),
|
||||
void *user_data,
|
||||
|
@ -370,6 +370,7 @@ sticker_load(const char *type, const char *uri, Error &error)
|
||||
|
||||
static sqlite3_stmt *
|
||||
BindFind(const char *type, const char *base_uri, const char *name,
|
||||
StickerOperator op, const char *value,
|
||||
Error &error)
|
||||
{
|
||||
assert(type != nullptr);
|
||||
@ -378,12 +379,21 @@ BindFind(const char *type, const char *base_uri, const char *name,
|
||||
if (base_uri == nullptr)
|
||||
base_uri = "";
|
||||
|
||||
switch (op) {
|
||||
case StickerOperator::EXISTS:
|
||||
return BindAllOrNull(error, sticker_stmt[STICKER_SQL_FIND],
|
||||
type, base_uri, name);
|
||||
}
|
||||
|
||||
(void)value;
|
||||
|
||||
assert(false);
|
||||
gcc_unreachable();
|
||||
}
|
||||
|
||||
bool
|
||||
sticker_find(const char *type, const char *base_uri, const char *name,
|
||||
StickerOperator op, const char *value,
|
||||
void (*func)(const char *uri, const char *value,
|
||||
void *user_data),
|
||||
void *user_data,
|
||||
@ -392,7 +402,8 @@ sticker_find(const char *type, const char *base_uri, const char *name,
|
||||
assert(func != nullptr);
|
||||
assert(sticker_enabled());
|
||||
|
||||
sqlite3_stmt *const stmt = BindFind(type, base_uri, name, error);
|
||||
sqlite3_stmt *const stmt = BindFind(type, base_uri, name, op, value,
|
||||
error);
|
||||
if (stmt == nullptr)
|
||||
return false;
|
||||
|
||||
|
@ -42,6 +42,7 @@
|
||||
#ifndef MPD_STICKER_DATABASE_HXX
|
||||
#define MPD_STICKER_DATABASE_HXX
|
||||
|
||||
#include "Match.hxx"
|
||||
#include "Compiler.h"
|
||||
|
||||
#include <string>
|
||||
@ -154,11 +155,14 @@ sticker_load(const char *type, const char *uri,
|
||||
* @param base_uri the URI prefix of the resources, or nullptr if all
|
||||
* resources should be searched
|
||||
* @param name the name of the sticker
|
||||
* @param op the comparison operator
|
||||
* @param value the operand
|
||||
* @return true on success (even if no sticker was found), false on
|
||||
* failure
|
||||
*/
|
||||
bool
|
||||
sticker_find(const char *type, const char *base_uri, const char *name,
|
||||
StickerOperator op, const char *value,
|
||||
void (*func)(const char *uri, const char *value,
|
||||
void *user_data),
|
||||
void *user_data,
|
||||
|
Loading…
Reference in New Issue
Block a user