Skip to content

Commit

Permalink
Fix and simplify implementation of Stash migrations
Browse files Browse the repository at this point in the history
  • Loading branch information
mmcgrana committed Jan 21, 2009
1 parent 60589bf commit 31c8bbc
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 61 deletions.
51 changes: 21 additions & 30 deletions stash-migrations/src/stash/migrations.clj
Original file line number Diff line number Diff line change
Expand Up @@ -30,26 +30,25 @@
(jdbc/modify (str "UPDATE schema_info SET version = " version)))

(defn ups
"Returns the subsequence of migrations needed to migrate a db up from
start-version to target-version."
[migrations start-version target-version]
(map (fn [[version f]] [version f version])
(map (fn [[version up-f down-f]] [version up-f version])
(take-while #(<= (first %) target-version)
(drop-while #(<= (first %) start-version) migrations))))

(defn- down-to-map
[migrations]
(reduce (fn [m [from to]] (assoc m from to)) {}
(partition 2 1 (reverse (cons 0 (map first migrations))))))
(reduce
(fn [m [from to]] (assoc m from to))
{}
(partition 2 1 (reverse (cons 0 (map first migrations))))))

(defn downs
"Returns the subsequence of migrations needed to migrate a db down from
start-version to target-version. Note that the returned subseqeunce is
reversed as is appropriate."
[migrations start-version target-version]
(let [dto-map (down-to-map migrations)]
(map (fn [[version f to]] [version f (dto-map to)])
(reverse (ups migrations target-version start-version)))))
(map (fn [[version up-f down-f]] [version down-f (dto-map version)])
(take-while #(> (first %) target-version)
(drop-while #(> (first %) start-version)
(reverse migrations))))))

(defn migrate
"Migrate a db according to the given migrations sequence up or down
Expand All @@ -76,30 +75,22 @@
(cond
; Migrate up.
(< start-version target-version)
(do
(let [up-tuples (ups migrations start-version target-version)]
(rep (str "migrating up, " start-version " to " target-version))
(let [ran (doall
(map (fn [[version up-f to]]
(rep (str "running " version " up"))
(up-f)
(set-version to)
version)
(ups migrations start-version target-version)))]
(rep (str "done, at " target-version))
ran))
(doseq [[version up-f to] up-tuples]
(rep (str "running " version " up"))
(up-f)
(set-version to))
(rep "done, at " target-version))
; Migrate down.
(> start-version target-version)
(do
(let [down-tuples (downs migrations start-version target-version)]
(rep (str "migrating down, " start-version " to " target-version))
(let [ran (doall
(map (fn [[version down-f to]]
(rep (str "running " version " down"))
(down-f)
(set-version to)
version)
(downs migrations start-version target-version)))]
(rep (str "done, at " target-version))
ran))
(doseq [[version down-f to] down-tuples]
(rep (str "running " version " down"))
(down-f)
(set-version to))
(rep (str "done, at " target-version)))
; Dont' migrate.
:else
(rep (str "migrating not needed, at " target-version)))))
Expand Down
67 changes: 36 additions & 31 deletions stash-migrations/test/stash/migrations_test.clj
Original file line number Diff line number Diff line change
Expand Up @@ -11,45 +11,50 @@
(assert= 1 (get-version))
(drop-version))

(def m1 #(constantly :1))
(def m3 #(constantly :3))
(def m5 #(constantly :5))
(def m7 #(constantly :7))
(def u1 #(constantly :u1))
(def u3 #(constantly :u3))
(def u5 #(constantly :u5))
(def u7 #(constantly :u7))

(def d1 #(constantly :d1))
(def d3 #(constantly :d3))
(def d5 #(constantly :d5))
(def d7 #(constantly :d7))

(def +migrations+
[[1 m1] [3 m3] [5 m5] [7 m7]])
[[1 u1 d1] [3 u3 d3] [5 u5 d5] [7 u7 d7]])

(deftest "ups"
(assert= [[1 m1 1] [3 m3 3] [5 m5 5] [7 m7 7]]
(assert= [[1 u1 1] [3 u3 3] [5 u5 5] [7 u7 7]]
(ups +migrations+ 0 7))
(assert= [[3 m3 3] [5 m5 5]]
(assert= [[3 u3 3] [5 u5 5]]
(ups +migrations+ 1 5)))

(deftest "downs"
(assert= [[7 m7 5] [5 m5 3] [3 m3 1] [1 m1 0]]
(assert= [[7 d7 5] [5 d5 3] [3 d3 1] [1 d1 0]]
(downs +migrations+ 7 0))
(assert= [[5 m5 3] [3 m3 1]]
(assert= [[5 d5 3] [3 d3 1]]
(downs +migrations+ 5 1)))

(deftest-conn "migrate: up, down, no migrations"
(ensure-version)
(assert-nil (migrate +migrations+ 0))
(assert= 0 (get-version))
(assert= '(1 3 5 7) (migrate +migrations+ 7))
(assert= 7 (get-version))
(assert= '(7 5 3 1) (migrate +migrations+ 0))
(assert= 0 (get-version))
(drop-version))

(deftest "migrate-with"
(let [logger {:test (constantly true) :log identity}]
(migrate-with +migrations+ 7 +data-source+ nil))
(jdbc/with-connection +data-source+ (drop-version)))

(deftest "defmigration"
(defmigration my-migration 10
:up
:down)
(assert= 10 (get my-migration 0))
(assert= :up ((get my-migration 1)))
(assert= :down ((get my-migration 2))))
;(deftest-conn "migrate: up, down, no migrations"
; (ensure-version)
; (assert-nil (migrate +migrations+ 0))
; (assert= 0 (get-version))
; (migrate +migrations+ 7)
; (assert= 7 (get-version))
; (migrate +migrations+ 0)
; (assert= 0 (get-version))
; (drop-version))
;
;(deftest "migrate-with"
; (let [logger {:test (constantly true) :log identity}]
; (migrate-with +migrations+ 7 +data-source+ nil))
; (jdbc/with-connection +data-source+ (drop-version)))
;
;(deftest "defmigration"
; (defmigration my-migration 10
; :up
; :down)
; (assert= 10 (get my-migration 0))
; (assert= :up ((get my-migration 1)))
; (assert= :down ((get my-migration 2))))

0 comments on commit 31c8bbc

Please sign in to comment.