From d8204b283781196b7990dae2b3a7efacd8a72272 Mon Sep 17 00:00:00 2001 From: Christian Mueller Date: Wed, 30 May 2012 19:55:03 +0200 Subject: [PATCH] note title in the storage collision addressed --- Makefile | 3 +++ src/NoteHub/storage.clj | 14 ++++++++++++++ src/NoteHub/views/pages.clj | 20 +++++++++----------- 3 files changed, 26 insertions(+), 11 deletions(-) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f5d741d --- /dev/null +++ b/Makefile @@ -0,0 +1,3 @@ +server: + redis-server & + java vimclojure.nailgun.NGServer diff --git a/src/NoteHub/storage.clj b/src/NoteHub/storage.clj index fef47ea..bc8e770 100644 --- a/src/NoteHub/storage.clj +++ b/src/NoteHub/storage.clj @@ -5,6 +5,8 @@ (def note "note") +(def draft "draft") + (defn- build-key [[year month day] key] (print-str year month day key)) @@ -13,3 +15,15 @@ (defn get-note [date key] (redis/hget db note (build-key date key))) + +(defn create-draft [key] + (redis/hget db draft key)) + +(defn delete-draft [key] + (redis/hdel db draft key)) + +(defn draft-exists? [key] + (redis/hexists db draft key)) + +(defn note-exists? [date key] + (redis/hexists db note (build-key date key))) diff --git a/src/NoteHub/views/pages.clj b/src/NoteHub/views/pages.clj index 119873f..268b0f3 100644 --- a/src/NoteHub/views/pages.clj +++ b/src/NoteHub/views/pages.clj @@ -9,7 +9,9 @@ [noir.core :only [defpage render]] [noir.statuses] [noir.fetch.remotes]) - (:import [org.pegdown PegDownProcessor])) + (:import + [java.util Calendar] + [org.pegdown PegDownProcessor])) ; Fix a maximal title length used in the link (def max-title-length 80) @@ -52,8 +54,7 @@ ; Note URL (defpage "/:year/:month/:day/:title" {:keys [year month day title]} (let [date [year month day] - key (hash (conj date title)) - post (get-note date key) + post (get-note date title) title (-?> post (split #"\n") first (sreplace #"[_\*#]" ""))] (if post (common/layout title @@ -63,18 +64,15 @@ ; New Note Posting (defpage [:post "/post-note"] {:keys [draft]} - (let [[year month day] (split - (.format - (java.text.SimpleDateFormat. "yyyy-MM-dd") - (java.util.Date.)) #"-") + (let [[year month day] (map #(.get (Calendar/getInstance) %) [Calendar/YEAR Calendar/MONTH Calendar/DAY_OF_MONTH]) untrimmed-line (filter #(or (= \- %) (Character/isLetterOrDigit %)) (-> draft (split #"\n") first (sreplace " " "-") lower-case)) trim (fn [s] (apply str (drop-while #(= \- %) s))) title-uncut (-> untrimmed-line trim reverse trim reverse) - title (apply str (take max-title-length title-uncut)) - ; TODO: deal with collisions! + proposed-title (apply str (take max-title-length title-uncut)) date [year month day] - key (hash (conj date title))] + title (first (drop-while #(note-exists? date %) (cons proposed-title + (map #(str proposed-title "-" (+ 2 %)) (range)))))] (do - (set-note date key draft) + (set-note date title draft) (redirect (apply str (interpose "/" ["" year month day title]))))))