22SqliteTripleSource::SqliteTripleSource(sqlite3 *db) : db(db)
28 int rid = (context !=
nullptr) ? context->
rid : -1;
29 std::string cond =
"";
37 char *
query =
nullptr;
38 query = sqlite3_mprintf(
" AND ns = %Q",
t.getNs());
43 cond +=
" AND ns IS NULL";
47 char *
query =
nullptr;
48 query = sqlite3_mprintf(
" AND name = %Q",
t.getName());
53 cond +=
" AND name IS NULL";
57 char *
query =
nullptr;
58 query = sqlite3_mprintf(
" AND value = %Q",
t.getValue());
63 cond +=
" AND value IS NULL";
71 sqlite3_stmt *statement =
nullptr;
72 char *
query =
nullptr;
73 query = sqlite3_mprintf(
"SELECT id FROM tags WHERE %s",
76 int result = sqlite3_prepare_v2(db,
query, -1, &statement,
nullptr);
77 if (result!=SQLITE_OK) {
78 yCWarning(SQLITETRIPLESOURCE,
"Error in query");
80 while (result == SQLITE_OK && sqlite3_step(statement) == SQLITE_ROW) {
82 yCWarning(SQLITETRIPLESOURCE,
"WARNING: multiple matches ignored");
84 out = sqlite3_column_int(statement,0);
85 yCTrace(SQLITETRIPLESOURCE,
"Match %d", out);
88 sqlite3_finalize(statement);
95 char *
query =
nullptr;
96 query = sqlite3_mprintf(
"DELETE FROM tags WHERE %s",
condition(ti,context).c_str());
98 int result = sqlite3_exec(db,
query,
nullptr,
nullptr,
nullptr);
99 if (result!=SQLITE_OK) {
100 yCWarning(SQLITETRIPLESOURCE,
"Error in query");
107 char *
query =
nullptr;
108 query = sqlite3_mprintf(
"DELETE FROM tags WHERE rid IS NOT NULL AND rid NOT IN (SELECT id FROM tags)");
110 int result = sqlite3_exec(db,
query,
nullptr,
nullptr,
nullptr);
111 if (result!=SQLITE_OK) {
112 yCWarning(SQLITETRIPLESOURCE,
"Error in query");
120 sqlite3_stmt *statement =
nullptr;
121 char *
query =
nullptr;
122 query = sqlite3_mprintf(
"SELECT id, ns, name, value FROM tags WHERE %s",
condition(ti,context).c_str());
124 int result = sqlite3_prepare_v2(db,
query, -1, &statement,
nullptr);
125 if (result!=SQLITE_OK) {
126 yCWarning(SQLITETRIPLESOURCE,
"Error in query");
128 while (result == SQLITE_OK && sqlite3_step(statement) == SQLITE_ROW) {
130 char *ns = (
char *)sqlite3_column_text(statement,1);
131 char *name = (
char *)sqlite3_column_text(statement,2);
132 char *value = (
char *)sqlite3_column_text(statement,3);
138 if (name !=
nullptr) {
142 if (value !=
nullptr) {
148 sqlite3_finalize(statement);
155 int rid = (context !=
nullptr)?context->
rid:-1;
156 char buf[100] =
"NULL";
158 std::snprintf(buf, 100,
"%d", rid);
166 char *
query = sqlite3_mprintf(
"INSERT INTO tags (rid,ns,name,value) VALUES(%s,%Q,%Q,%Q)",
168 t.getNs(),
t.getName(),
t.getValue());
170 int result = sqlite3_exec(db,
query,
nullptr,
nullptr, &msg);
171 if (result!=SQLITE_OK) {
172 if (msg !=
nullptr) {
173 yCError(SQLITETRIPLESOURCE,
"Error: %s", msg);
175 yCError(SQLITETRIPLESOURCE,
"(Location): %s:%d", __FILE__, __LINE__);
185 char *
query =
nullptr;
186 if (
t.hasName||
t.hasNs) {
189 query = sqlite3_mprintf(
"UPDATE tags SET value = %Q WHERE %s",
193 query = sqlite3_mprintf(
"UPDATE tags SET value = %Q WHERE id = %Q",
198 int result = sqlite3_exec(db,
query,
nullptr,
nullptr, &msg);
199 if (result!=SQLITE_OK) {
200 if (msg !=
nullptr) {
201 yCError(SQLITETRIPLESOURCE,
"Error: %s", msg);
205 int ct = sqlite3_changes(db);
206 if (ct==0 && (
t.hasName||
t.hasNs)) {
214 int result = sqlite3_exec(db,
"BEGIN TRANSACTION;",
nullptr,
nullptr,
nullptr);
215 yCDebug(SQLITETRIPLESOURCE,
"Query: BEGIN TRANSACTION;");
216 if (result!=SQLITE_OK) {
217 yCWarning(SQLITETRIPLESOURCE,
"Error in BEGIN query");
223 int result = sqlite3_exec(db,
"END TRANSACTION;",
nullptr,
nullptr,
nullptr);
224 yCDebug(SQLITETRIPLESOURCE,
"Query: END TRANSACTION;");
225 if (result!=SQLITE_OK) {
226 yCWarning(SQLITETRIPLESOURCE,
"Error in END query");
Sqlite database, viewed as a collection of triples.
std::string condition(Triple &t, TripleContext *context)
std::string expressContext(TripleContext *context)
void prune(TripleContext *context) override
std::list< Triple > query(Triple &ti, TripleContext *context) override
void insert(Triple &t, TripleContext *context) override
int find(Triple &t, TripleContext *context) override
void remove_query(Triple &ti, TripleContext *context) override
void begin(TripleContext *context) override
void end(TripleContext *context) override
void update(Triple &t, TripleContext *context) override
Side information for controlling access to triples.
The basic unit of data the name server works with.
#define yCError(component,...)
#define yCTrace(component,...)
#define yCWarning(component,...)
#define yCDebug(component,...)
#define YARP_SERVERSQL_LOG_COMPONENT(name, name_string)