local sql = require("lsqlite3") local db = require("db") local queries = require("queries") local util = require("util") local tags = {} local stmnt_get_tags, stmnt_ins_tag, stmnt_drop_tags local oldconfigure = configure function configure(...) --Tags for a story stmnt_ins_tag = assert(db.conn:prepare(queries.insert_tag)) stmnt_get_tags = assert(db.conn:prepare(queries.select_tags)) stmnt_drop_tags = assert(db.conn:prepare(queries.delete_tags)) return oldconfigure(...) end function tags.get(id) local ret = {} stmnt_get_tags:bind_names{ id = id } local err repeat err = stmnt_get_tags:step() if err == sql.BUSY then coroutine.yield() elseif err == sql.ROW then table.insert(ret,stmnt_get_tags:get_value(0)) elseif err == sql.DONE then stmnt_get_tags:reset() return ret else error(string.format("Failed to get tags for story %d : %d", id, err)) end until false end function tags.set(storyid,tags) assert(stmnt_drop_tags:bind_names{postid = storyid} == sql.OK) db.do_sql(stmnt_drop_tags) stmnt_drop_tags:reset() local err for _,tag in pairs(tags) do assert(stmnt_ins_tag:bind(1,storyid) == sql.OK) assert(stmnt_ins_tag:bind(2,tag) == sql.OK) err = db.do_sql(stmnt_ins_tag) stmnt_ins_tag:reset() end if err ~= sql.DONE then log(LOG_CRIT,"Failed to save tags on " .. storyid) end end return tags