summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/datalayer.clj14
-rw-r--r--src/multikey_cache.clj15
-rw-r--r--src/site.clj4
-rw-r--r--src/tags.clj5
-rwxr-xr-xsrc/utils.clj5
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]