view src/clojure/contrib/test_contrib/test_sql.clj @ 10:ef7dbbd6452c

added clojure source goodness
author Robert McIntyre <rlm@mit.edu>
date Sat, 21 Aug 2010 06:25:44 -0400
parents
children
line wrap: on
line source
1 ;; Copyright (c) Stephen C. Gilardi. All rights reserved. The use and
2 ;; distribution terms for this software are covered by the Eclipse Public
3 ;; License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) which can
4 ;; be found in the file epl-v10.html at the root of this distribution. By
5 ;; using this software in any fashion, you are agreeing to be bound by the
6 ;; terms of this license. You must not remove this notice, or any other,
7 ;; from this software.
8 ;;
9 ;; test.clj
10 ;;
11 ;; test/example for clojure.contrib.sql
12 ;;
13 ;; scgilardi (gmail)
14 ;; Created 13 September 2008
16 (ns clojure.contrib.test-sql
17 (:use [clojure.contrib.sql :as sql :only ()]))
19 (def db {:classname "org.apache.derby.jdbc.EmbeddedDriver"
20 :subprotocol "derby"
21 :subname "/tmp/clojure.contrib.sql.test.db"
22 :create true})
24 (defn create-fruit
25 "Create a table"
26 []
27 (sql/create-table
28 :fruit
29 [:name "varchar(32)" "PRIMARY KEY"]
30 [:appearance "varchar(32)"]
31 [:cost :int]
32 [:grade :real]))
34 (defn drop-fruit
35 "Drop a table"
36 []
37 (try
38 (sql/drop-table :fruit)
39 (catch Exception _)))
41 (defn insert-rows-fruit
42 "Insert complete rows"
43 []
44 (sql/insert-rows
45 :fruit
46 ["Apple" "red" 59 87]
47 ["Banana" "yellow" 29 92.2]
48 ["Peach" "fuzzy" 139 90.0]
49 ["Orange" "juicy" 89 88.6]))
51 (defn insert-values-fruit
52 "Insert rows with values for only specific columns"
53 []
54 (sql/insert-values
55 :fruit
56 [:name :cost]
57 ["Mango" 722]
58 ["Feijoa" 441]))
60 (defn insert-records-fruit
61 "Insert records, maps from keys specifying columns to values"
62 []
63 (sql/insert-records
64 :fruit
65 {:name "Pomegranate" :appearance "fresh" :cost 585}
66 {:name "Kiwifruit" :grade 93}))
68 (defn db-write
69 "Write initial values to the database as a transaction"
70 []
71 (sql/with-connection db
72 (sql/transaction
73 (drop-fruit)
74 (create-fruit)
75 (insert-rows-fruit)
76 (insert-values-fruit)
77 (insert-records-fruit)))
78 nil)
80 (defn db-read
81 "Read the entire fruit table"
82 []
83 (sql/with-connection db
84 (sql/with-query-results res
85 ["SELECT * FROM fruit"]
86 (doseq [rec res]
87 (println rec)))))
89 (defn db-update-appearance-cost
90 "Update the appearance and cost of the named fruit"
91 [name appearance cost]
92 (sql/update-values
93 :fruit
94 ["name=?" name]
95 {:appearance appearance :cost cost}))
97 (defn db-update
98 "Update two fruits as a transaction"
99 []
100 (sql/with-connection db
101 (sql/transaction
102 (db-update-appearance-cost "Banana" "bruised" 14)
103 (db-update-appearance-cost "Feijoa" "green" 400)))
104 nil)
106 (defn db-update-or-insert
107 "Updates or inserts a fruit"
108 [record]
109 (sql/with-connection db
110 (sql/update-or-insert-values
111 :fruit
112 ["name=?" (:name record)]
113 record)))
115 (defn db-read-all
116 "Return all the rows of the fruit table as a vector"
117 []
118 (sql/with-connection db
119 (sql/with-query-results res
120 ["SELECT * FROM fruit"]
121 (into [] res))))
123 (defn db-grade-range
124 "Print rows describing fruit that are within a grade range"
125 [min max]
126 (sql/with-connection db
127 (sql/with-query-results res
128 [(str "SELECT name, cost, grade "
129 "FROM fruit "
130 "WHERE grade >= ? AND grade <= ?")
131 min max]
132 (doseq [rec res]
133 (println rec)))))
135 (defn db-grade-a
136 "Print rows describing all grade a fruit (grade between 90 and 100)"
137 []
138 (db-grade-range 90 100))
140 (defn db-get-tables
141 "Demonstrate getting table info"
142 []
143 (sql/with-connection db
144 (into []
145 (resultset-seq
146 (-> (sql/connection)
147 (.getMetaData)
148 (.getTables nil nil nil (into-array ["TABLE" "VIEW"])))))))
150 (defn db-exception
151 "Demonstrate rolling back a partially completed transaction on exception"
152 []
153 (sql/with-connection db
154 (sql/transaction
155 (sql/insert-values
156 :fruit
157 [:name :appearance]
158 ["Grape" "yummy"]
159 ["Pear" "bruised"])
160 ;; at this point the insert-values call is complete, but the transaction
161 ;; is not. the exception will cause it to roll back leaving the database
162 ;; untouched.
163 (throw (Exception. "sql/test exception")))))
165 (defn db-sql-exception
166 "Demonstrate an sql exception"
167 []
168 (sql/with-connection db
169 (sql/transaction
170 (sql/insert-values
171 :fruit
172 [:name :appearance]
173 ["Grape" "yummy"]
174 ["Pear" "bruised"]
175 ["Apple" "strange" "whoops"]))))
177 (defn db-batchupdate-exception
178 "Demonstrate a batch update exception"
179 []
180 (sql/with-connection db
181 (sql/transaction
182 (sql/do-commands
183 "DROP TABLE fruit"
184 "DROP TABLE fruit"))))
186 (defn db-rollback
187 "Demonstrate a rollback-only trasaction"
188 []
189 (sql/with-connection db
190 (sql/transaction
191 (prn "is-rollback-only" (sql/is-rollback-only))
192 (sql/set-rollback-only)
193 (sql/insert-values
194 :fruit
195 [:name :appearance]
196 ["Grape" "yummy"]
197 ["Pear" "bruised"])
198 (prn "is-rollback-only" (sql/is-rollback-only))
199 (sql/with-query-results res
200 ["SELECT * FROM fruit"]
201 (doseq [rec res]
202 (println rec))))
203 (prn)
204 (sql/with-query-results res
205 ["SELECT * FROM fruit"]
206 (doseq [rec res]
207 (println rec)))))