diff --git a/inc/lektor/commands.h b/inc/lektor/commands.h index 9309062fc9e30febb5f1b20b026445f84ddbe1a0..9b18e0e9ca38c0781a55a07d16dae456cde2f4d7 100644 --- a/inc/lektor/commands.h +++ b/inc/lektor/commands.h @@ -86,6 +86,7 @@ bool command_update (struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARG bool command_rescan (struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]); /* Sticker management */ +bool command_sticker_create(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]); bool command_sticker_get (struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]); bool command_sticker_set (struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]); bool command_sticker_delete(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]); diff --git a/src/commands.c b/src/commands.c index 81a65c06d791970b3844117b5f8fc13e5697219d..495e0c195398ee6399ec27cef7f947382e617704 100644 --- a/src/commands.c +++ b/src/commands.c @@ -736,30 +736,18 @@ sticker_send(struct lkt_state *srv, size_t c, char *name, int id, int value) return true; } -/* bool -command_sticker_get(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]) +command_sticker_create(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]) { - RETURN_UNLESS(argv[0] && argv[1] && argv[2] && !argv[3], "Invalid argument", false); - long uri; - char *endptr, err; - STRTOL(uri, argv[1], endptr, err); - RETURN_IF(err, "STRTOL failed", false); - struct lkt_search cb = { - .call = (void(*)(void)) sticker_send, - .srv = srv, - .c = c, - .name = argv[2], - .st_type = argv[0], - .st_uri = (int) uri, - }; - if (!database_search_sticker_init(srv->db, &cb)) + UNUSED(c); + RETURN_UNLESS(argv[0], "Invalid argument", false); + if (!database_sticker_create(srv->db, argv[0])) { + LOG_ERROR_SCT("COMMAND", "Failed to create sticker '%s'", argv[0]); return false; - while (database_search_iter(&cb)) - continue; + } + LOG_INFO_SCT("COMMAND", "Created sticker '%s'", argv[0]); return true; } -*/ bool command_sticker_set(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]) diff --git a/src/database/stickers.c b/src/database/stickers.c index 34ca0d4a72fb44501acf05d15c9f8aa2ad565471..6f52e6eee8ea4ed773e13a59ace2d13242019ef8 100644 --- a/src/database/stickers.c +++ b/src/database/stickers.c @@ -11,18 +11,17 @@ bool database_sticker_create(volatile sqlite3 *db, const char *name) { static const char *INSERT = - "WITH id_max (id) AS (SELECT MAX(id) FROM 'stickers')" "INSERT INTO 'stickers' (id, name)" - " SELECT CASE WHEN id_max.id IS NULL THEN 1 ELSE id_max.id + 1 END, ?" - " FROM id_max" - "WHERE NOT EXISTS (SELECT 1 FROM 'stickers' WHERE name = ?);"; + " SELECT CASE WHEN MAX(id) IS NULL THEN 1 ELSE MAX(id) + 1 END, ?" + " FROM 'stickers'" + "WHERE (SELECT COUNT(*) FROM 'stickers' WHERE name = ?) = 0;"; sqlite3_stmt *stmt; int ret = false; RETURN_IF(strlen(name) == 0, "A sticker name must be at least one character long", ret); SQLITE_PREPARE(db, stmt, INSERT, error); SQLITE_BIND_TEXT(db, stmt, 1, name, error); SQLITE_BIND_TEXT(db, stmt, 2, name, error); - SQLITE_STEP_OK(db, stmt, error); + SQLITE_STEP_DONE(db, stmt, error); ret = true; error: sqlite3_finalize(stmt); @@ -79,7 +78,7 @@ database_sticker_set(volatile sqlite3 *db, const char *type, const char *name, i SQLITE_BIND_INT(db, stmt, 1, uri, error); SQLITE_BIND_INT(db, stmt, 2, value, error); SQLITE_BIND_TEXT(db, stmt, 3, name, error); - SQLITE_STEP_OK(db, stmt, error); + SQLITE_STEP_DONE(db, stmt, error); ret = true; error: sqlite3_finalize(stmt); diff --git a/src/net/listen.c b/src/net/listen.c index 427a9793e9b1b91cc73f3a5ebc18d3bf98acf749..e52a2eca92223454887f725801691e89de217388 100644 --- a/src/net/listen.c +++ b/src/net/listen.c @@ -206,6 +206,8 @@ handle_simple_command(struct lkt_state *srv, size_t c, struct lkt_command cmd) err = ! command_sticker_set(srv, c, &cmd.args[1]); else if (STR_MATCH(cmd.args[0], "delete")) err = ! command_sticker_delete(srv, c, &cmd.args[1]); + else if (STR_MATCH(cmd.args[0], "__create")) + err = ! command_sticker_create(srv, c, &cmd.args[1]); } else if (STR_MATCH(cmd.name, "help"))