diff --git a/app.moon b/app.moon index 87f647a..e74cfb0 100644 --- a/app.moon +++ b/app.moon @@ -68,7 +68,7 @@ class extends lapis.Application if tag_pattern != tag_pattern\lower! return redirect_to: @url_for "tag", name: escape(tag_pattern\lower!), order: @order, asc_desc: @asc_desc, page: @page tag_pattern = escape_literal tag_pattern - tag_pattern = "'% " .. tag_pattern\sub(2, -2) .. " %'" + tag_pattern = "'% #{tag_pattern\sub 2, -2} %'" tracks = Tracks\paginated "WHERE tags LIKE #{tag_pattern} ORDER BY #{escape_identifier @order} #{@asc_desc}", per_page: 32 @last_page = 1 diff --git a/nginx.conf b/nginx.conf index 465726a..43d9090 100644 --- a/nginx.conf +++ b/nginx.conf @@ -11,6 +11,11 @@ http { charset UTF-8; include mime.types; + lua_shared_dict worker 5k; + init_worker_by_lua ' + require("worker") + '; + server { listen ${{PORT}}; lua_code_cache ${{CODE_CACHE}}; diff --git a/worker.moon b/worker.moon new file mode 100644 index 0000000..8a953f0 --- /dev/null +++ b/worker.moon @@ -0,0 +1,30 @@ +lock = require "resty.lock" + +import Tags, Tracks from require "models" +import escape_literal from require "lapis.db" + +add_job = (interval, name, fn, init) -> + run = (premature, arg) -> + if premature return + + thread_lock = lock\new "worker". { timeout: 0, exptime: interval } + if thread_lock\lock "t#{name}" + + time_lock = lock\new "worker", { exptime: interval } + if time_lock\lock "t#{name}" + arg = fn(arg) + thread_lock\unlock! + ngx.timer.at(interval, run, arg) + ngx.timer.at(0, run, init) + +update_tag_counts = (id=1) -> + if tag = Tags\find(:id) + tag_pattern = escape_literal tag.name + tag_pattern = "'% #{tag_pattern\sub 2, -2} %'" + count = Tracks\count "tags LIKE #{tag_pattern}" + tag\update(:count) + next_tag = Tags\select "WHERE id > ? ORDER BY id ASC LIMIT 1", id + if next_tag = next_tag[1] + return next_tag.id + +add_job 60, "tags", update_tag_counts