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/command/StickerCommands.cxx src/command/StickerCommands.hxx \
|
||||||
src/lib/sqlite/Domain.cxx src/lib/sqlite/Domain.hxx \
|
src/lib/sqlite/Domain.cxx src/lib/sqlite/Domain.hxx \
|
||||||
src/lib/sqlite/Util.hxx \
|
src/lib/sqlite/Util.hxx \
|
||||||
|
src/sticker/Match.hxx \
|
||||||
src/sticker/StickerDatabase.cxx src/sticker/StickerDatabase.hxx \
|
src/sticker/StickerDatabase.cxx src/sticker/StickerDatabase.hxx \
|
||||||
src/sticker/StickerPrint.cxx src/sticker/StickerPrint.hxx \
|
src/sticker/StickerPrint.cxx src/sticker/StickerPrint.hxx \
|
||||||
src/sticker/SongSticker.cxx src/sticker/SongSticker.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];
|
const char *const base_uri = args[2];
|
||||||
|
|
||||||
|
StickerOperator op = StickerOperator::EXISTS;
|
||||||
|
const char *value = nullptr;
|
||||||
|
|
||||||
bool success;
|
bool success;
|
||||||
struct sticker_song_find_data data = {
|
struct sticker_song_find_data data = {
|
||||||
client,
|
client,
|
||||||
|
@ -150,6 +153,7 @@ handle_sticker_song(Client &client, ConstBuffer<const char *> args)
|
||||||
};
|
};
|
||||||
|
|
||||||
success = sticker_song_find(*db, base_uri, data.name,
|
success = sticker_song_find(*db, base_uri, data.name,
|
||||||
|
op, value,
|
||||||
sticker_song_find_print_cb, &data,
|
sticker_song_find_print_cb, &data,
|
||||||
error);
|
error);
|
||||||
if (!success) {
|
if (!success) {
|
||||||
|
|
|
@ -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
|
bool
|
||||||
sticker_song_find(const Database &db, const char *base_uri, const char *name,
|
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 (*func)(const LightSong &song, const char *value,
|
||||||
void *user_data),
|
void *user_data),
|
||||||
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);
|
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,
|
sticker_song_find_cb, &data,
|
||||||
error);
|
error);
|
||||||
free(allocated);
|
free(allocated);
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#ifndef MPD_SONG_STICKER_HXX
|
#ifndef MPD_SONG_STICKER_HXX
|
||||||
#define MPD_SONG_STICKER_HXX
|
#define MPD_SONG_STICKER_HXX
|
||||||
|
|
||||||
|
#include "Match.hxx"
|
||||||
#include "Compiler.h"
|
#include "Compiler.h"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
@ -30,7 +31,8 @@ class Database;
|
||||||
class Error;
|
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
|
gcc_pure
|
||||||
std::string
|
std::string
|
||||||
|
@ -81,6 +83,7 @@ sticker_song_get(const LightSong &song, Error &error);
|
||||||
*/
|
*/
|
||||||
bool
|
bool
|
||||||
sticker_song_find(const Database &db, const char *base_uri, const char *name,
|
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 (*func)(const LightSong &song, const char *value,
|
||||||
void *user_data),
|
void *user_data),
|
||||||
void *user_data,
|
void *user_data,
|
||||||
|
|
|
@ -370,6 +370,7 @@ sticker_load(const char *type, const char *uri, Error &error)
|
||||||
|
|
||||||
static sqlite3_stmt *
|
static sqlite3_stmt *
|
||||||
BindFind(const char *type, const char *base_uri, const char *name,
|
BindFind(const char *type, const char *base_uri, const char *name,
|
||||||
|
StickerOperator op, const char *value,
|
||||||
Error &error)
|
Error &error)
|
||||||
{
|
{
|
||||||
assert(type != nullptr);
|
assert(type != nullptr);
|
||||||
|
@ -378,12 +379,21 @@ BindFind(const char *type, const char *base_uri, const char *name,
|
||||||
if (base_uri == nullptr)
|
if (base_uri == nullptr)
|
||||||
base_uri = "";
|
base_uri = "";
|
||||||
|
|
||||||
return BindAllOrNull(error, sticker_stmt[STICKER_SQL_FIND],
|
switch (op) {
|
||||||
type, base_uri, name);
|
case StickerOperator::EXISTS:
|
||||||
|
return BindAllOrNull(error, sticker_stmt[STICKER_SQL_FIND],
|
||||||
|
type, base_uri, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
(void)value;
|
||||||
|
|
||||||
|
assert(false);
|
||||||
|
gcc_unreachable();
|
||||||
}
|
}
|
||||||
|
|
||||||
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,
|
||||||
|
StickerOperator op, const char *value,
|
||||||
void (*func)(const char *uri, const char *value,
|
void (*func)(const char *uri, const char *value,
|
||||||
void *user_data),
|
void *user_data),
|
||||||
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(func != nullptr);
|
||||||
assert(sticker_enabled());
|
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)
|
if (stmt == nullptr)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
|
@ -42,6 +42,7 @@
|
||||||
#ifndef MPD_STICKER_DATABASE_HXX
|
#ifndef MPD_STICKER_DATABASE_HXX
|
||||||
#define MPD_STICKER_DATABASE_HXX
|
#define MPD_STICKER_DATABASE_HXX
|
||||||
|
|
||||||
|
#include "Match.hxx"
|
||||||
#include "Compiler.h"
|
#include "Compiler.h"
|
||||||
|
|
||||||
#include <string>
|
#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
|
* @param base_uri the URI prefix of the resources, or nullptr if all
|
||||||
* resources should be searched
|
* resources should be searched
|
||||||
* @param name the name of the sticker
|
* @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
|
* @return true on success (even if no sticker was found), false on
|
||||||
* failure
|
* failure
|
||||||
*/
|
*/
|
||||||
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,
|
||||||
|
StickerOperator op, const char *value,
|
||||||
void (*func)(const char *uri, const char *value,
|
void (*func)(const char *uri, const char *value,
|
||||||
void *user_data),
|
void *user_data),
|
||||||
void *user_data,
|
void *user_data,
|
||||||
|
|
Loading…
Reference in New Issue