diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/datalayer.clj | 14 | ||||
| -rw-r--r-- | src/multikey_cache.clj | 15 | ||||
| -rw-r--r-- | src/site.clj | 4 | ||||
| -rw-r--r-- | src/tags.clj | 5 | ||||
| -rwxr-xr-x | src/utils.clj | 5 |
5 files changed, 27 insertions, 16 deletions
diff --git a/src/datalayer.clj b/src/datalayer.clj index c74315a..56d5a60 100644 --- a/src/datalayer.clj +++ b/src/datalayer.clj @@ -85,7 +85,8 @@ WHERE u.nick = ANY(?)" (def message-cache-size 50000) (def message-cache (multikey-lru-cache fetch-messages-by-id-uncached - message-cache-size)) + message-cache-size + to-int)) (defn fetch-messages-by-id [m-ids] (get-keys message-cache m-ids)) @@ -154,14 +155,17 @@ WHERE u.nick = ANY(?)" {symbol (.getElement t) :score (int (.getScore t))})) -(defn fetch-redis-daily-hall [date-str offset num] +(defn fetch-redis-daily-hall [date-str offset num user-id] (let [msg-ids (fetch-redis-zset (redis-daily-hall-key date-str) :message_id offset num) - full-msgs (fetch-messages-by-id (map :message_id msg-ids))] - (for [[info full] (map list msg-ids full-msgs)] - (assoc full :score (:score info))))) + full-msgs (fetch-messages-by-id (map :message_id msg-ids)) + full-msgs (for [[info full] (map list msg-ids full-msgs)] + (assoc full :score (:score info)))] + (if user-id + (tags/add-user-favs-to-msgs full-msgs user-id) + full-msgs))) (defn fetch-redis-directory [page num] (vec diff --git a/src/multikey_cache.clj b/src/multikey_cache.clj index 74822a8..ac462ca 100644 --- a/src/multikey_cache.clj +++ b/src/multikey_cache.clj @@ -5,14 +5,16 @@ cache-dot-clj.cache )) -(defn multikey-lru-cache [f max-size] - {:f f - :lru (java.util.Collections/synchronizedMap (LRUMap. max-size)) +(defn multikey-lru-cache [func max-size canonicalizer] + {:func func + :lru (java.util.Collections/synchronizedMap (LRUMap. max-size)) + :canonicalizer canonicalizer }) (defn get-keys [c keys] - (let [f (:f c) + (let [f (:func c) lru (:lru c) + keys (map (:canonicalizer c) keys) uncached (filter (complement #(.containsKey lru %)) keys)] (when-not (empty? uncached) (doseq [[k v] (map list uncached (f uncached))] @@ -23,8 +25,9 @@ (first (get-keys c [key]))) (defn has-key [c key] - (.containsKey (:lru c) key)) + (.containsKey (:lru c) + ((:canonicalizer c) key))) (defn invalidate-key [c key] - (.remove (:lru c) key) + (.remove (:lru c) ((:canonicalizer c) key)) nil) diff --git a/src/site.clj b/src/site.clj index 2e1bfe8..98524d4 100644 --- a/src/site.clj +++ b/src/site.clj @@ -196,7 +196,7 @@ (let [st (fetch-template "frontpage" session) date-str (format-yyyymmdd (Date.)) dumps (map process-message-for-output - (fetch-redis-daily-hall date-str 0 20))] + (fetch-redis-daily-hall date-str 0 20 (:user_id session)))] (.setAttribute st "dumps" dumps) (.toString st))) @@ -788,8 +788,8 @@ WHERE user_id IN (let [nick (session :nick) user-id (session :user_id) msg-id (params :message_id) - tag (validate-tag (params :tag)) msg (fetch-message-by-id msg-id) + tag (validate-tag (params :tag)) access (or (is-vip? session) (not (:admin_only msg)))] (cond (not msg) (resp-error "NO_MSG") diff --git a/src/tags.clj b/src/tags.clj index 76bc762..19b2531 100644 --- a/src/tags.clj +++ b/src/tags.clj @@ -86,9 +86,8 @@ WHERE EXISTS (sql-array "int" (map :message_id msgs)) user-id])))] (for [m msgs] - (if (contains? faved-ids (:message_id m)) - (assoc m :favorited true) - m)))) + (assoc m :favorited + (contains? faved-ids (:message_id m)))))) (defn explain-query [query] (str "EXPLAIN ANALYZE " query)) diff --git a/src/utils.clj b/src/utils.clj index eb89cf1..22a0b5d 100755 --- a/src/utils.clj +++ b/src/utils.clj @@ -321,6 +321,11 @@ ;; Parsing +(defn to-int [x] + (cond (integer? x) x + (string? x) (Integer/parseInt x) + :else (throw (Exception. (str "Invalid argument " x))))) + (defn maybe-parse-int ([s] (maybe-parse-int s 0)) ([s a] |
