Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
M
mpd
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Иван Мажукин
mpd
Commits
204a1de3
Commit
204a1de3
authored
Dec 12, 2014
by
Max Kellermann
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
sticker/Database: use the Error library
parent
80ddf4ae
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
125 additions
and
83 deletions
+125
-83
Instance.cxx
src/Instance.cxx
+2
-1
StickerCommands.cxx
src/command/StickerCommands.cxx
+23
-7
Util.hxx
src/lib/sqlite/Util.hxx
+28
-24
SongSticker.cxx
src/sticker/SongSticker.cxx
+16
-12
SongSticker.hxx
src/sticker/SongSticker.hxx
+10
-6
StickerDatabase.cxx
src/sticker/StickerDatabase.cxx
+34
-27
StickerDatabase.hxx
src/sticker/StickerDatabase.hxx
+12
-6
No files found.
src/Instance.cxx
View file @
204a1de3
...
@@ -22,6 +22,7 @@
...
@@ -22,6 +22,7 @@
#include "Partition.hxx"
#include "Partition.hxx"
#include "Idle.hxx"
#include "Idle.hxx"
#include "Stats.hxx"
#include "Stats.hxx"
#include "util/Error.hxx"
#ifdef ENABLE_DATABASE
#ifdef ENABLE_DATABASE
#include "db/DatabaseError.hxx"
#include "db/DatabaseError.hxx"
...
@@ -76,7 +77,7 @@ Instance::OnDatabaseSongRemoved(const LightSong &song)
...
@@ -76,7 +77,7 @@ Instance::OnDatabaseSongRemoved(const LightSong &song)
#ifdef ENABLE_SQLITE
#ifdef ENABLE_SQLITE
/* if the song has a sticker, remove it */
/* if the song has a sticker, remove it */
if
(
sticker_enabled
())
if
(
sticker_enabled
())
sticker_song_delete
(
song
);
sticker_song_delete
(
song
,
IgnoreError
()
);
#endif
#endif
const
auto
uri
=
song
.
GetURI
();
const
auto
uri
=
song
.
GetURI
();
...
...
src/command/StickerCommands.cxx
View file @
204a1de3
...
@@ -67,9 +67,13 @@ handle_sticker_song(Client &client, ConstBuffer<const char *> args)
...
@@ -67,9 +67,13 @@ handle_sticker_song(Client &client, ConstBuffer<const char *> args)
if
(
song
==
nullptr
)
if
(
song
==
nullptr
)
return
print_error
(
client
,
error
);
return
print_error
(
client
,
error
);
const
auto
value
=
sticker_song_get_value
(
*
song
,
args
[
3
]);
const
auto
value
=
sticker_song_get_value
(
*
song
,
args
[
3
],
error
);
db
->
ReturnSong
(
song
);
db
->
ReturnSong
(
song
);
if
(
value
.
empty
())
{
if
(
value
.
empty
())
{
if
(
error
.
IsDefined
())
return
print_error
(
client
,
error
);
command_error
(
client
,
ACK_ERROR_NO_EXIST
,
command_error
(
client
,
ACK_ERROR_NO_EXIST
,
"no such sticker"
);
"no such sticker"
);
return
CommandResult
::
ERROR
;
return
CommandResult
::
ERROR
;
...
@@ -84,12 +88,13 @@ handle_sticker_song(Client &client, ConstBuffer<const char *> args)
...
@@ -84,12 +88,13 @@ handle_sticker_song(Client &client, ConstBuffer<const char *> args)
if
(
song
==
nullptr
)
if
(
song
==
nullptr
)
return
print_error
(
client
,
error
);
return
print_error
(
client
,
error
);
sticker
*
sticker
=
sticker_song_get
(
*
song
);
sticker
*
sticker
=
sticker_song_get
(
*
song
,
error
);
db
->
ReturnSong
(
song
);
db
->
ReturnSong
(
song
);
if
(
sticker
)
{
if
(
sticker
)
{
sticker_print
(
client
,
*
sticker
);
sticker_print
(
client
,
*
sticker
);
sticker_free
(
sticker
);
sticker_free
(
sticker
);
}
}
else
if
(
error
.
IsDefined
())
return
print_error
(
client
,
error
);
return
CommandResult
::
OK
;
return
CommandResult
::
OK
;
/* set song song_id id key */
/* set song song_id id key */
...
@@ -98,9 +103,13 @@ handle_sticker_song(Client &client, ConstBuffer<const char *> args)
...
@@ -98,9 +103,13 @@ handle_sticker_song(Client &client, ConstBuffer<const char *> args)
if
(
song
==
nullptr
)
if
(
song
==
nullptr
)
return
print_error
(
client
,
error
);
return
print_error
(
client
,
error
);
bool
ret
=
sticker_song_set_value
(
*
song
,
args
[
3
],
args
[
4
]);
bool
ret
=
sticker_song_set_value
(
*
song
,
args
[
3
],
args
[
4
],
error
);
db
->
ReturnSong
(
song
);
db
->
ReturnSong
(
song
);
if
(
!
ret
)
{
if
(
!
ret
)
{
if
(
error
.
IsDefined
())
return
print_error
(
client
,
error
);
command_error
(
client
,
ACK_ERROR_SYSTEM
,
command_error
(
client
,
ACK_ERROR_SYSTEM
,
"failed to set sticker value"
);
"failed to set sticker value"
);
return
CommandResult
::
ERROR
;
return
CommandResult
::
ERROR
;
...
@@ -115,10 +124,13 @@ handle_sticker_song(Client &client, ConstBuffer<const char *> args)
...
@@ -115,10 +124,13 @@ handle_sticker_song(Client &client, ConstBuffer<const char *> args)
return
print_error
(
client
,
error
);
return
print_error
(
client
,
error
);
bool
ret
=
args
.
size
==
3
bool
ret
=
args
.
size
==
3
?
sticker_song_delete
(
*
song
)
?
sticker_song_delete
(
*
song
,
error
)
:
sticker_song_delete_value
(
*
song
,
args
[
3
]);
:
sticker_song_delete_value
(
*
song
,
args
[
3
]
,
error
);
db
->
ReturnSong
(
song
);
db
->
ReturnSong
(
song
);
if
(
!
ret
)
{
if
(
!
ret
)
{
if
(
error
.
IsDefined
())
return
print_error
(
client
,
error
);
command_error
(
client
,
ACK_ERROR_SYSTEM
,
command_error
(
client
,
ACK_ERROR_SYSTEM
,
"no such sticker"
);
"no such sticker"
);
return
CommandResult
::
ERROR
;
return
CommandResult
::
ERROR
;
...
@@ -138,8 +150,12 @@ handle_sticker_song(Client &client, ConstBuffer<const char *> args)
...
@@ -138,8 +150,12 @@ 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
,
sticker_song_find_print_cb
,
&
data
);
sticker_song_find_print_cb
,
&
data
,
error
);
if
(
!
success
)
{
if
(
!
success
)
{
if
(
error
.
IsDefined
())
return
print_error
(
client
,
error
);
command_error
(
client
,
ACK_ERROR_SYSTEM
,
command_error
(
client
,
ACK_ERROR_SYSTEM
,
"failed to set search sticker database"
);
"failed to set search sticker database"
);
return
CommandResult
::
ERROR
;
return
CommandResult
::
ERROR
;
...
...
src/lib/sqlite/Util.hxx
View file @
204a1de3
...
@@ -21,30 +21,31 @@
...
@@ -21,30 +21,31 @@
#define MPD_SQLITE_UTIL_HXX
#define MPD_SQLITE_UTIL_HXX
#include "Domain.hxx"
#include "Domain.hxx"
#include "
Log
.hxx"
#include "
util/Error
.hxx"
#include <sqlite3.h>
#include <sqlite3.h>
#include <assert.h>
#include <assert.h>
static
void
static
void
LogError
(
sqlite3
*
db
,
const
char
*
msg
)
SetError
(
Error
&
error
,
sqlite3
*
db
,
int
code
,
const
char
*
msg
)
{
{
FormatError
(
sqlite_domain
,
"%s: %s"
,
msg
,
sqlite3_errmsg
(
db
));
error
.
Format
(
sqlite_domain
,
code
,
"%s: %s"
,
msg
,
sqlite3_errmsg
(
db
));
}
}
static
void
static
void
LogError
(
sqlite3_stmt
*
stmt
,
const
char
*
msg
)
SetError
(
Error
&
error
,
sqlite3_stmt
*
stmt
,
int
code
,
const
char
*
msg
)
{
{
LogError
(
sqlite3_db_handle
(
stmt
)
,
msg
);
SetError
(
error
,
sqlite3_db_handle
(
stmt
),
code
,
msg
);
}
}
static
bool
static
bool
Bind
(
sqlite3_stmt
*
stmt
,
unsigned
i
,
const
char
*
value
)
Bind
(
sqlite3_stmt
*
stmt
,
unsigned
i
,
const
char
*
value
,
Error
&
error
)
{
{
int
result
=
sqlite3_bind_text
(
stmt
,
i
,
value
,
-
1
,
nullptr
);
int
result
=
sqlite3_bind_text
(
stmt
,
i
,
value
,
-
1
,
nullptr
);
if
(
result
!=
SQLITE_OK
)
{
if
(
result
!=
SQLITE_OK
)
{
LogError
(
stm
t
,
"sqlite3_bind_text() failed"
);
SetError
(
error
,
stmt
,
resul
t
,
"sqlite3_bind_text() failed"
);
return
false
;
return
false
;
}
}
...
@@ -53,7 +54,8 @@ Bind(sqlite3_stmt *stmt, unsigned i, const char *value)
...
@@ -53,7 +54,8 @@ Bind(sqlite3_stmt *stmt, unsigned i, const char *value)
template
<
typename
...
Args
>
template
<
typename
...
Args
>
static
bool
static
bool
BindAll2
(
gcc_unused
sqlite3_stmt
*
stmt
,
gcc_unused
unsigned
i
)
BindAll2
(
gcc_unused
Error
&
error
,
gcc_unused
sqlite3_stmt
*
stmt
,
gcc_unused
unsigned
i
)
{
{
assert
(
int
(
i
-
1
)
==
sqlite3_bind_parameter_count
(
stmt
));
assert
(
int
(
i
-
1
)
==
sqlite3_bind_parameter_count
(
stmt
));
...
@@ -62,19 +64,20 @@ BindAll2(gcc_unused sqlite3_stmt *stmt, gcc_unused unsigned i)
...
@@ -62,19 +64,20 @@ BindAll2(gcc_unused sqlite3_stmt *stmt, gcc_unused unsigned i)
template
<
typename
...
Args
>
template
<
typename
...
Args
>
static
bool
static
bool
BindAll2
(
sqlite3_stmt
*
stmt
,
unsigned
i
,
const
char
*
value
,
Args
&&
...
args
)
BindAll2
(
Error
&
error
,
sqlite3_stmt
*
stmt
,
unsigned
i
,
const
char
*
value
,
Args
&&
...
args
)
{
{
return
Bind
(
stmt
,
i
,
value
)
&&
return
Bind
(
stmt
,
i
,
value
,
error
)
&&
BindAll2
(
stmt
,
i
+
1
,
std
::
forward
<
Args
>
(
args
)...);
BindAll2
(
error
,
stmt
,
i
+
1
,
std
::
forward
<
Args
>
(
args
)...);
}
}
template
<
typename
...
Args
>
template
<
typename
...
Args
>
static
bool
static
bool
BindAll
(
sqlite3_stmt
*
stmt
,
Args
&&
...
args
)
BindAll
(
Error
&
error
,
sqlite3_stmt
*
stmt
,
Args
&&
...
args
)
{
{
assert
(
int
(
sizeof
...(
args
))
==
sqlite3_bind_parameter_count
(
stmt
));
assert
(
int
(
sizeof
...(
args
))
==
sqlite3_bind_parameter_count
(
stmt
));
return
BindAll2
(
stmt
,
1
,
std
::
forward
<
Args
>
(
args
)...);
return
BindAll2
(
error
,
stmt
,
1
,
std
::
forward
<
Args
>
(
args
)...);
}
}
/**
/**
...
@@ -96,14 +99,14 @@ ExecuteBusy(sqlite3_stmt *stmt)
...
@@ -96,14 +99,14 @@ ExecuteBusy(sqlite3_stmt *stmt)
* Wrapper for ExecuteBusy() that returns true on SQLITE_ROW.
* Wrapper for ExecuteBusy() that returns true on SQLITE_ROW.
*/
*/
static
bool
static
bool
ExecuteRow
(
sqlite3_stmt
*
stmt
)
ExecuteRow
(
sqlite3_stmt
*
stmt
,
Error
&
error
)
{
{
int
result
=
ExecuteBusy
(
stmt
);
int
result
=
ExecuteBusy
(
stmt
);
if
(
result
==
SQLITE_ROW
)
if
(
result
==
SQLITE_ROW
)
return
true
;
return
true
;
if
(
result
!=
SQLITE_DONE
)
if
(
result
!=
SQLITE_DONE
)
LogError
(
sqlite_domain
,
"sqlite3_step() failed"
);
SetError
(
error
,
stmt
,
result
,
"sqlite3_step() failed"
);
return
false
;
return
false
;
}
}
...
@@ -113,11 +116,11 @@ ExecuteRow(sqlite3_stmt *stmt)
...
@@ -113,11 +116,11 @@ ExecuteRow(sqlite3_stmt *stmt)
* SQLITE_DONE as error.
* SQLITE_DONE as error.
*/
*/
static
bool
static
bool
ExecuteCommand
(
sqlite3_stmt
*
stmt
)
ExecuteCommand
(
sqlite3_stmt
*
stmt
,
Error
&
error
)
{
{
int
result
=
ExecuteBusy
(
stmt
);
int
result
=
ExecuteBusy
(
stmt
);
if
(
result
!=
SQLITE_DONE
)
{
if
(
result
!=
SQLITE_DONE
)
{
LogError
(
stm
t
,
"sqlite3_step() failed"
);
SetError
(
error
,
stmt
,
resul
t
,
"sqlite3_step() failed"
);
return
false
;
return
false
;
}
}
...
@@ -129,9 +132,9 @@ ExecuteCommand(sqlite3_stmt *stmt)
...
@@ -129,9 +132,9 @@ ExecuteCommand(sqlite3_stmt *stmt)
* modified via sqlite3_changes(). Returns -1 on error.
* modified via sqlite3_changes(). Returns -1 on error.
*/
*/
static
inline
int
static
inline
int
ExecuteChanges
(
sqlite3_stmt
*
stmt
)
ExecuteChanges
(
sqlite3_stmt
*
stmt
,
Error
&
error
)
{
{
if
(
!
ExecuteCommand
(
stmt
))
if
(
!
ExecuteCommand
(
stmt
,
error
))
return
-
1
;
return
-
1
;
return
sqlite3_changes
(
sqlite3_db_handle
(
stmt
));
return
sqlite3_changes
(
sqlite3_db_handle
(
stmt
));
...
@@ -143,17 +146,18 @@ ExecuteChanges(sqlite3_stmt *stmt)
...
@@ -143,17 +146,18 @@ ExecuteChanges(sqlite3_stmt *stmt)
* occurred.
* occurred.
*/
*/
static
inline
bool
static
inline
bool
ExecuteModified
(
sqlite3_stmt
*
stmt
)
ExecuteModified
(
sqlite3_stmt
*
stmt
,
Error
&
error
)
{
{
return
ExecuteChanges
(
stmt
)
>
0
;
return
ExecuteChanges
(
stmt
,
error
)
>
0
;
}
}
template
<
typename
F
>
template
<
typename
F
>
static
inline
bool
static
inline
bool
ExecuteForEach
(
sqlite3_stmt
*
stmt
,
F
&&
f
)
ExecuteForEach
(
sqlite3_stmt
*
stmt
,
Error
&
error
,
F
&&
f
)
{
{
while
(
true
)
{
while
(
true
)
{
switch
(
ExecuteBusy
(
stmt
))
{
int
result
=
ExecuteBusy
(
stmt
);
switch
(
result
)
{
case
SQLITE_ROW
:
case
SQLITE_ROW
:
f
();
f
();
break
;
break
;
...
@@ -162,7 +166,7 @@ ExecuteForEach(sqlite3_stmt *stmt, F &&f)
...
@@ -162,7 +166,7 @@ ExecuteForEach(sqlite3_stmt *stmt, F &&f)
return
true
;
return
true
;
default
:
default
:
LogError
(
sqlite_domain
,
"sqlite3_step() failed"
);
SetError
(
error
,
stmt
,
result
,
"sqlite3_step() failed"
);
return
false
;
return
false
;
}
}
}
}
...
...
src/sticker/SongSticker.cxx
View file @
204a1de3
...
@@ -30,39 +30,41 @@
...
@@ -30,39 +30,41 @@
#include <stdlib.h>
#include <stdlib.h>
std
::
string
std
::
string
sticker_song_get_value
(
const
LightSong
&
song
,
const
char
*
name
)
sticker_song_get_value
(
const
LightSong
&
song
,
const
char
*
name
,
Error
&
error
)
{
{
const
auto
uri
=
song
.
GetURI
();
const
auto
uri
=
song
.
GetURI
();
return
sticker_load_value
(
"song"
,
uri
.
c_str
(),
name
);
return
sticker_load_value
(
"song"
,
uri
.
c_str
(),
name
,
error
);
}
}
bool
bool
sticker_song_set_value
(
const
LightSong
&
song
,
sticker_song_set_value
(
const
LightSong
&
song
,
const
char
*
name
,
const
char
*
value
)
const
char
*
name
,
const
char
*
value
,
Error
&
error
)
{
{
const
auto
uri
=
song
.
GetURI
();
const
auto
uri
=
song
.
GetURI
();
return
sticker_store_value
(
"song"
,
uri
.
c_str
(),
name
,
value
);
return
sticker_store_value
(
"song"
,
uri
.
c_str
(),
name
,
value
,
error
);
}
}
bool
bool
sticker_song_delete
(
const
LightSong
&
song
)
sticker_song_delete
(
const
LightSong
&
song
,
Error
&
error
)
{
{
const
auto
uri
=
song
.
GetURI
();
const
auto
uri
=
song
.
GetURI
();
return
sticker_delete
(
"song"
,
uri
.
c_str
());
return
sticker_delete
(
"song"
,
uri
.
c_str
()
,
error
);
}
}
bool
bool
sticker_song_delete_value
(
const
LightSong
&
song
,
const
char
*
name
)
sticker_song_delete_value
(
const
LightSong
&
song
,
const
char
*
name
,
Error
&
error
)
{
{
const
auto
uri
=
song
.
GetURI
();
const
auto
uri
=
song
.
GetURI
();
return
sticker_delete_value
(
"song"
,
uri
.
c_str
(),
name
);
return
sticker_delete_value
(
"song"
,
uri
.
c_str
(),
name
,
error
);
}
}
struct
sticker
*
struct
sticker
*
sticker_song_get
(
const
LightSong
&
song
)
sticker_song_get
(
const
LightSong
&
song
,
Error
&
error
)
{
{
const
auto
uri
=
song
.
GetURI
();
const
auto
uri
=
song
.
GetURI
();
return
sticker_load
(
"song"
,
uri
.
c_str
());
return
sticker_load
(
"song"
,
uri
.
c_str
()
,
error
);
}
}
struct
sticker_song_find_data
{
struct
sticker_song_find_data
{
...
@@ -97,7 +99,8 @@ bool
...
@@ -97,7 +99,8 @@ 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
,
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
,
Error
&
error
)
{
{
struct
sticker_song_find_data
data
;
struct
sticker_song_find_data
data
;
data
.
db
=
&
db
;
data
.
db
=
&
db
;
...
@@ -117,7 +120,8 @@ sticker_song_find(const Database &db, const char *base_uri, const char *name,
...
@@ -117,7 +120,8 @@ 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
,
sticker_song_find_cb
,
&
data
);
sticker_song_find_cb
,
&
data
,
error
);
free
(
allocated
);
free
(
allocated
);
return
success
;
return
success
;
...
...
src/sticker/SongSticker.hxx
View file @
204a1de3
...
@@ -27,13 +27,14 @@
...
@@ -27,13 +27,14 @@
struct
LightSong
;
struct
LightSong
;
struct
sticker
;
struct
sticker
;
class
Database
;
class
Database
;
class
Error
;
/**
/**
* Returns one value from a song's sticker record.
* Returns one value from a song's sticker record.
*/
*/
gcc_pure
gcc_pure
std
::
string
std
::
string
sticker_song_get_value
(
const
LightSong
&
song
,
const
char
*
name
);
sticker_song_get_value
(
const
LightSong
&
song
,
const
char
*
name
,
Error
&
error
);
/**
/**
* Sets a sticker value in the specified song. Overwrites existing
* Sets a sticker value in the specified song. Overwrites existing
...
@@ -41,20 +42,22 @@ sticker_song_get_value(const LightSong &song, const char *name);
...
@@ -41,20 +42,22 @@ sticker_song_get_value(const LightSong &song, const char *name);
*/
*/
bool
bool
sticker_song_set_value
(
const
LightSong
&
song
,
sticker_song_set_value
(
const
LightSong
&
song
,
const
char
*
name
,
const
char
*
value
);
const
char
*
name
,
const
char
*
value
,
Error
&
error
);
/**
/**
* Deletes a sticker from the database. All values are deleted.
* Deletes a sticker from the database. All values are deleted.
*/
*/
bool
bool
sticker_song_delete
(
const
LightSong
&
song
);
sticker_song_delete
(
const
LightSong
&
song
,
Error
&
error
);
/**
/**
* Deletes a sticker value. Does nothing if the sticker did not
* Deletes a sticker value. Does nothing if the sticker did not
* exist.
* exist.
*/
*/
bool
bool
sticker_song_delete_value
(
const
LightSong
&
song
,
const
char
*
name
);
sticker_song_delete_value
(
const
LightSong
&
song
,
const
char
*
name
,
Error
&
error
);
/**
/**
* Loads the sticker for the specified song.
* Loads the sticker for the specified song.
...
@@ -63,7 +66,7 @@ sticker_song_delete_value(const LightSong &song, const char *name);
...
@@ -63,7 +66,7 @@ sticker_song_delete_value(const LightSong &song, const char *name);
* @return a sticker object, or NULL on error or if there is no sticker
* @return a sticker object, or NULL on error or if there is no sticker
*/
*/
sticker
*
sticker
*
sticker_song_get
(
const
LightSong
&
song
);
sticker_song_get
(
const
LightSong
&
song
,
Error
&
error
);
/**
/**
* Finds stickers with the specified name below the specified
* Finds stickers with the specified name below the specified
...
@@ -80,6 +83,7 @@ bool
...
@@ -80,6 +83,7 @@ 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
,
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
,
Error
&
error
);
#endif
#endif
src/sticker/StickerDatabase.cxx
View file @
204a1de3
...
@@ -25,7 +25,6 @@
...
@@ -25,7 +25,6 @@
#include "Idle.hxx"
#include "Idle.hxx"
#include "util/Error.hxx"
#include "util/Error.hxx"
#include "util/Macros.hxx"
#include "util/Macros.hxx"
#include "Log.hxx"
#include <string>
#include <string>
#include <map>
#include <map>
...
@@ -157,7 +156,8 @@ sticker_enabled()
...
@@ -157,7 +156,8 @@ sticker_enabled()
}
}
std
::
string
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
,
Error
&
error
)
{
{
sqlite3_stmt
*
const
stmt
=
sticker_stmt
[
STICKER_SQL_GET
];
sqlite3_stmt
*
const
stmt
=
sticker_stmt
[
STICKER_SQL_GET
];
...
@@ -169,11 +169,11 @@ sticker_load_value(const char *type, const char *uri, const char *name)
...
@@ -169,11 +169,11 @@ sticker_load_value(const char *type, const char *uri, const char *name)
if
(
*
name
==
0
)
if
(
*
name
==
0
)
return
std
::
string
();
return
std
::
string
();
if
(
!
BindAll
(
stmt
,
type
,
uri
,
name
))
if
(
!
BindAll
(
error
,
stmt
,
type
,
uri
,
name
))
return
std
::
string
();
return
std
::
string
();
std
::
string
value
;
std
::
string
value
;
if
(
ExecuteRow
(
stmt
))
if
(
ExecuteRow
(
stmt
,
error
))
value
=
(
const
char
*
)
sqlite3_column_text
(
stmt
,
0
);
value
=
(
const
char
*
)
sqlite3_column_text
(
stmt
,
0
);
sqlite3_reset
(
stmt
);
sqlite3_reset
(
stmt
);
...
@@ -184,7 +184,8 @@ sticker_load_value(const char *type, const char *uri, const char *name)
...
@@ -184,7 +184,8 @@ sticker_load_value(const char *type, const char *uri, const char *name)
static
bool
static
bool
sticker_list_values
(
std
::
map
<
std
::
string
,
std
::
string
>
&
table
,
sticker_list_values
(
std
::
map
<
std
::
string
,
std
::
string
>
&
table
,
const
char
*
type
,
const
char
*
uri
)
const
char
*
type
,
const
char
*
uri
,
Error
&
error
)
{
{
sqlite3_stmt
*
const
stmt
=
sticker_stmt
[
STICKER_SQL_LIST
];
sqlite3_stmt
*
const
stmt
=
sticker_stmt
[
STICKER_SQL_LIST
];
...
@@ -192,10 +193,10 @@ sticker_list_values(std::map<std::string, std::string> &table,
...
@@ -192,10 +193,10 @@ sticker_list_values(std::map<std::string, std::string> &table,
assert
(
uri
!=
nullptr
);
assert
(
uri
!=
nullptr
);
assert
(
sticker_enabled
());
assert
(
sticker_enabled
());
if
(
!
BindAll
(
stmt
,
type
,
uri
))
if
(
!
BindAll
(
error
,
stmt
,
type
,
uri
))
return
false
;
return
false
;
const
bool
success
=
ExecuteForEach
(
stmt
,
[
stmt
,
&
table
](){
const
bool
success
=
ExecuteForEach
(
stmt
,
error
,
[
stmt
,
&
table
](){
const
char
*
name
=
(
const
char
*
)
sqlite3_column_text
(
stmt
,
0
);
const
char
*
name
=
(
const
char
*
)
sqlite3_column_text
(
stmt
,
0
);
const
char
*
value
=
(
const
char
*
)
sqlite3_column_text
(
stmt
,
1
);
const
char
*
value
=
(
const
char
*
)
sqlite3_column_text
(
stmt
,
1
);
table
.
insert
(
std
::
make_pair
(
name
,
value
));
table
.
insert
(
std
::
make_pair
(
name
,
value
));
...
@@ -209,7 +210,8 @@ sticker_list_values(std::map<std::string, std::string> &table,
...
@@ -209,7 +210,8 @@ sticker_list_values(std::map<std::string, std::string> &table,
static
bool
static
bool
sticker_update_value
(
const
char
*
type
,
const
char
*
uri
,
sticker_update_value
(
const
char
*
type
,
const
char
*
uri
,
const
char
*
name
,
const
char
*
value
)
const
char
*
name
,
const
char
*
value
,
Error
&
error
)
{
{
sqlite3_stmt
*
const
stmt
=
sticker_stmt
[
STICKER_SQL_UPDATE
];
sqlite3_stmt
*
const
stmt
=
sticker_stmt
[
STICKER_SQL_UPDATE
];
...
@@ -221,10 +223,10 @@ sticker_update_value(const char *type, const char *uri,
...
@@ -221,10 +223,10 @@ sticker_update_value(const char *type, const char *uri,
assert
(
sticker_enabled
());
assert
(
sticker_enabled
());
if
(
!
BindAll
(
stmt
,
value
,
type
,
uri
,
name
))
if
(
!
BindAll
(
error
,
stmt
,
value
,
type
,
uri
,
name
))
return
false
;
return
false
;
bool
modified
=
ExecuteModified
(
stmt
);
bool
modified
=
ExecuteModified
(
stmt
,
error
);
sqlite3_reset
(
stmt
);
sqlite3_reset
(
stmt
);
sqlite3_clear_bindings
(
stmt
);
sqlite3_clear_bindings
(
stmt
);
...
@@ -236,7 +238,8 @@ sticker_update_value(const char *type, const char *uri,
...
@@ -236,7 +238,8 @@ sticker_update_value(const char *type, const char *uri,
static
bool
static
bool
sticker_insert_value
(
const
char
*
type
,
const
char
*
uri
,
sticker_insert_value
(
const
char
*
type
,
const
char
*
uri
,
const
char
*
name
,
const
char
*
value
)
const
char
*
name
,
const
char
*
value
,
Error
&
error
)
{
{
sqlite3_stmt
*
const
stmt
=
sticker_stmt
[
STICKER_SQL_INSERT
];
sqlite3_stmt
*
const
stmt
=
sticker_stmt
[
STICKER_SQL_INSERT
];
...
@@ -248,10 +251,10 @@ sticker_insert_value(const char *type, const char *uri,
...
@@ -248,10 +251,10 @@ sticker_insert_value(const char *type, const char *uri,
assert
(
sticker_enabled
());
assert
(
sticker_enabled
());
if
(
!
BindAll
(
stmt
,
type
,
uri
,
name
,
value
))
if
(
!
BindAll
(
error
,
stmt
,
type
,
uri
,
name
,
value
))
return
false
;
return
false
;
bool
success
=
ExecuteCommand
(
stmt
);
bool
success
=
ExecuteCommand
(
stmt
,
error
);
sqlite3_reset
(
stmt
);
sqlite3_reset
(
stmt
);
sqlite3_clear_bindings
(
stmt
);
sqlite3_clear_bindings
(
stmt
);
...
@@ -263,7 +266,8 @@ sticker_insert_value(const char *type, const char *uri,
...
@@ -263,7 +266,8 @@ sticker_insert_value(const char *type, const char *uri,
bool
bool
sticker_store_value
(
const
char
*
type
,
const
char
*
uri
,
sticker_store_value
(
const
char
*
type
,
const
char
*
uri
,
const
char
*
name
,
const
char
*
value
)
const
char
*
name
,
const
char
*
value
,
Error
&
error
)
{
{
assert
(
sticker_enabled
());
assert
(
sticker_enabled
());
assert
(
type
!=
nullptr
);
assert
(
type
!=
nullptr
);
...
@@ -274,12 +278,12 @@ sticker_store_value(const char *type, const char *uri,
...
@@ -274,12 +278,12 @@ sticker_store_value(const char *type, const char *uri,
if
(
*
name
==
0
)
if
(
*
name
==
0
)
return
false
;
return
false
;
return
sticker_update_value
(
type
,
uri
,
name
,
value
)
||
return
sticker_update_value
(
type
,
uri
,
name
,
value
,
error
)
||
sticker_insert_value
(
type
,
uri
,
name
,
value
);
sticker_insert_value
(
type
,
uri
,
name
,
value
,
error
);
}
}
bool
bool
sticker_delete
(
const
char
*
type
,
const
char
*
uri
)
sticker_delete
(
const
char
*
type
,
const
char
*
uri
,
Error
&
error
)
{
{
sqlite3_stmt
*
const
stmt
=
sticker_stmt
[
STICKER_SQL_DELETE
];
sqlite3_stmt
*
const
stmt
=
sticker_stmt
[
STICKER_SQL_DELETE
];
...
@@ -287,10 +291,10 @@ sticker_delete(const char *type, const char *uri)
...
@@ -287,10 +291,10 @@ sticker_delete(const char *type, const char *uri)
assert
(
type
!=
nullptr
);
assert
(
type
!=
nullptr
);
assert
(
uri
!=
nullptr
);
assert
(
uri
!=
nullptr
);
if
(
!
BindAll
(
stmt
,
type
,
uri
))
if
(
!
BindAll
(
error
,
stmt
,
type
,
uri
))
return
false
;
return
false
;
bool
modified
=
ExecuteModified
(
stmt
);
bool
modified
=
ExecuteModified
(
stmt
,
error
);
sqlite3_reset
(
stmt
);
sqlite3_reset
(
stmt
);
sqlite3_clear_bindings
(
stmt
);
sqlite3_clear_bindings
(
stmt
);
...
@@ -301,7 +305,8 @@ sticker_delete(const char *type, const char *uri)
...
@@ -301,7 +305,8 @@ sticker_delete(const char *type, const char *uri)
}
}
bool
bool
sticker_delete_value
(
const
char
*
type
,
const
char
*
uri
,
const
char
*
name
)
sticker_delete_value
(
const
char
*
type
,
const
char
*
uri
,
const
char
*
name
,
Error
&
error
)
{
{
sqlite3_stmt
*
const
stmt
=
sticker_stmt
[
STICKER_SQL_DELETE_VALUE
];
sqlite3_stmt
*
const
stmt
=
sticker_stmt
[
STICKER_SQL_DELETE_VALUE
];
...
@@ -309,10 +314,10 @@ sticker_delete_value(const char *type, const char *uri, const char *name)
...
@@ -309,10 +314,10 @@ sticker_delete_value(const char *type, const char *uri, const char *name)
assert
(
type
!=
nullptr
);
assert
(
type
!=
nullptr
);
assert
(
uri
!=
nullptr
);
assert
(
uri
!=
nullptr
);
if
(
!
BindAll
(
stmt
,
type
,
uri
,
name
))
if
(
!
BindAll
(
error
,
stmt
,
type
,
uri
,
name
))
return
false
;
return
false
;
bool
modified
=
ExecuteModified
(
stmt
);
bool
modified
=
ExecuteModified
(
stmt
,
error
);
sqlite3_reset
(
stmt
);
sqlite3_reset
(
stmt
);
sqlite3_clear_bindings
(
stmt
);
sqlite3_clear_bindings
(
stmt
);
...
@@ -349,11 +354,11 @@ sticker_foreach(const sticker &sticker,
...
@@ -349,11 +354,11 @@ sticker_foreach(const sticker &sticker,
}
}
struct
sticker
*
struct
sticker
*
sticker_load
(
const
char
*
type
,
const
char
*
uri
)
sticker_load
(
const
char
*
type
,
const
char
*
uri
,
Error
&
error
)
{
{
sticker
s
;
sticker
s
;
if
(
!
sticker_list_values
(
s
.
table
,
type
,
uri
))
if
(
!
sticker_list_values
(
s
.
table
,
type
,
uri
,
error
))
return
nullptr
;
return
nullptr
;
if
(
s
.
table
.
empty
())
if
(
s
.
table
.
empty
())
...
@@ -367,7 +372,8 @@ bool
...
@@ -367,7 +372,8 @@ 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
,
void
*
user_data
),
void
*
user_data
),
void
*
user_data
)
void
*
user_data
,
Error
&
error
)
{
{
sqlite3_stmt
*
const
stmt
=
sticker_stmt
[
STICKER_SQL_FIND
];
sqlite3_stmt
*
const
stmt
=
sticker_stmt
[
STICKER_SQL_FIND
];
...
@@ -379,10 +385,11 @@ sticker_find(const char *type, const char *base_uri, const char *name,
...
@@ -379,10 +385,11 @@ sticker_find(const char *type, const char *base_uri, const char *name,
if
(
base_uri
==
nullptr
)
if
(
base_uri
==
nullptr
)
base_uri
=
""
;
base_uri
=
""
;
if
(
!
BindAll
(
stmt
,
type
,
base_uri
,
name
))
if
(
!
BindAll
(
error
,
stmt
,
type
,
base_uri
,
name
))
return
false
;
return
false
;
const
bool
success
=
ExecuteForEach
(
stmt
,
[
stmt
,
func
,
user_data
](){
const
bool
success
=
ExecuteForEach
(
stmt
,
error
,
[
stmt
,
func
,
user_data
](){
func
((
const
char
*
)
sqlite3_column_text
(
stmt
,
0
),
func
((
const
char
*
)
sqlite3_column_text
(
stmt
,
0
),
(
const
char
*
)
sqlite3_column_text
(
stmt
,
1
),
(
const
char
*
)
sqlite3_column_text
(
stmt
,
1
),
user_data
);
user_data
);
...
...
src/sticker/StickerDatabase.hxx
View file @
204a1de3
...
@@ -76,7 +76,8 @@ sticker_enabled();
...
@@ -76,7 +76,8 @@ sticker_enabled();
* empty string if the value doesn't exist.
* empty string if the value doesn't exist.
*/
*/
std
::
string
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
,
Error
&
error
);
/**
/**
* Sets a sticker value in the specified object. Overwrites existing
* Sets a sticker value in the specified object. Overwrites existing
...
@@ -84,21 +85,24 @@ sticker_load_value(const char *type, const char *uri, const char *name);
...
@@ -84,21 +85,24 @@ sticker_load_value(const char *type, const char *uri, const char *name);
*/
*/
bool
bool
sticker_store_value
(
const
char
*
type
,
const
char
*
uri
,
sticker_store_value
(
const
char
*
type
,
const
char
*
uri
,
const
char
*
name
,
const
char
*
value
);
const
char
*
name
,
const
char
*
value
,
Error
&
error
);
/**
/**
* Deletes a sticker from the database. All sticker values of the
* Deletes a sticker from the database. All sticker values of the
* specified object are deleted.
* specified object are deleted.
*/
*/
bool
bool
sticker_delete
(
const
char
*
type
,
const
char
*
uri
);
sticker_delete
(
const
char
*
type
,
const
char
*
uri
,
Error
&
error
);
/**
/**
* Deletes a sticker value. Fails if no sticker with this name
* Deletes a sticker value. Fails if no sticker with this name
* exists.
* exists.
*/
*/
bool
bool
sticker_delete_value
(
const
char
*
type
,
const
char
*
uri
,
const
char
*
name
);
sticker_delete_value
(
const
char
*
type
,
const
char
*
uri
,
const
char
*
name
,
Error
&
error
);
/**
/**
* Frees resources held by the sticker object.
* Frees resources held by the sticker object.
...
@@ -140,7 +144,8 @@ sticker_foreach(const sticker &sticker,
...
@@ -140,7 +144,8 @@ sticker_foreach(const sticker &sticker,
* @return a sticker object, or nullptr on error or if there is no sticker
* @return a sticker object, or nullptr on error or if there is no sticker
*/
*/
sticker
*
sticker
*
sticker_load
(
const
char
*
type
,
const
char
*
uri
);
sticker_load
(
const
char
*
type
,
const
char
*
uri
,
Error
&
error
);
/**
/**
* Finds stickers with the specified name below the specified URI.
* Finds stickers with the specified name below the specified URI.
...
@@ -156,6 +161,7 @@ bool
...
@@ -156,6 +161,7 @@ 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
,
void
*
user_data
),
void
*
user_data
),
void
*
user_data
);
void
*
user_data
,
Error
&
error
);
#endif
#endif
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment