diff --git a/src/next/jdbc.clj b/src/next/jdbc.clj index 8c3d0b8..8d50c89 100644 --- a/src/next/jdbc.clj +++ b/src/next/jdbc.clj @@ -45,98 +45,3 @@ (defmacro with-transaction [[sym connectable opts] & body] `(p/-transact ~connectable (fn [~sym] ~@body) ~opts)) - -(comment - (def db-spec {:dbtype "h2:mem" :dbname "perf"}) - (def db-spec {:dbtype "derby" :dbname "perf" :create true}) - (def db-spec {:dbtype "mysql" :dbname "worldsingles" :user "root" :password "visual"}) - (def con db-spec) - (def con (get-datasource db-spec)) - (get-connection con {}) - (def con (get-connection (get-datasource db-spec) {})) - (def con (get-connection db-spec {})) - (execute! con ["DROP TABLE fruit"]) - ;; h2 - (execute! con ["CREATE TABLE fruit (id int default 0, name varchar(32) primary key, appearance varchar(32), cost int, grade real)"]) - (execute! con ["INSERT INTO fruit (id,name,appearance,cost,grade) VALUES (1,'Apple','red',59,87), (2,'Banana','yellow',29,92.2), (3,'Peach','fuzzy',139,90.0), (4,'Orange','juicy',89,88.6)"]) - ;; mysql - (execute! con ["CREATE TABLE fruit (id int auto_increment, name varchar(32), appearance varchar(32), cost int, grade real, primary key (id))"]) - (execute! con ["INSERT INTO fruit (id,name,appearance,cost,grade) VALUES (1,'Apple','red',59,87), (2,'Banana','yellow',29,92.2), (3,'Peach','fuzzy',139,90.0), (4,'Orange','juicy',89,88.6)"] - {:return-keys true}) - - (.close con) - - (require '[criterium.core :refer [bench quick-bench]]) - - ;; calibrate - (quick-bench (reduce + (take 10e6 (range)))) - - ;; raw java - (defn select* [^java.sql.Connection con] - (let [ps (doto (.prepareStatement con "SELECT * FROM fruit WHERE appearance = ?") - (.setObject 1 "red")) - rs (.executeQuery ps) - _ (.next rs) - value (.getObject rs "name")] - (.close ps) - value)) - (quick-bench (select* con)) - - ;; almost same as the Java example above - (quick-bench - (reduce (fn [rs m] (reduced (:name m))) - nil - (reducible! con ["select * from fruit where appearance = ?" "red"]))) - (quick-bench - (execute-one! con - ["select * from fruit where appearance = ?" "red"] - {:row-fn :name})) - - ;; simple query - (quick-bench - (execute! con ["select * from fruit where appearance = ?" "red"])) - - ;; with a prepopulated prepared statement - (with-open [ps (prepare con ["select * from fruit where appearance = ?" "red"] {})] - (quick-bench - [(reduce (fn [_ row] (reduced (:name row))) - nil - (reducible! ps))])) - - ;; same as above but setting parameters inside the benchmark - (with-open [ps (prepare con ["select * from fruit where appearance = ?"] {})] - (quick-bench - [(reduce (fn [_ row] (reduced (:name row))) - nil - (reducible! (prepare/set-parameters ps ["red"])))])) - - ;; this takes more than twice the time of the one above which seems strange - (with-open [ps (prepare con ["select * from fruit where appearance = ?"] {})] - (quick-bench - [(reduce (fn [_ row] (reduced (:name row))) - nil - (reducible! (prepare/set-parameters ps ["red"]))) - (reduce (fn [_ row] (reduced (:name row))) - nil - (reducible! (prepare/set-parameters ps ["fuzzy"])))])) - - ;; full first row - (quick-bench - (execute-one! con ["select * from fruit where appearance = ?" "red"])) - - ;; test assoc works - (execute-one! con - ["select * from fruit where appearance = ?" "red"] - {:row-fn #(assoc % :test :value)}) - - ;; test assoc works - (execute! con - ["select * from fruit where appearance = ?" "red"] - {:row-fn #(assoc % :test :value)}) - - (with-transaction [t con {:rollback-only? true}] - (execute! t ["INSERT INTO fruit (id,name,appearance,cost,grade) VALUES (5,'Pear','green',49,47)"]) - (execute! t ["select * from fruit where name = ?" "Pear"])) - (execute! con ["select * from fruit where name = ?" "Pear"]) - - (execute! con ["select * from membership"])) diff --git a/test/next/jdbc_test.clj b/test/next/jdbc_test.clj index eb9101b..822f69f 100644 --- a/test/next/jdbc_test.clj +++ b/test/next/jdbc_test.clj @@ -1,7 +1,105 @@ (ns next.jdbc-test (:require [clojure.test :refer [deftest is testing]] - [next.jdbc :as j])) + [next.jdbc :refer :all])) (deftest a-test (testing "FIXME, I fail." (is (= 0 1)))) + +(comment + (def db-spec {:dbtype "h2:mem" :dbname "perf"}) + (def db-spec {:dbtype "derby" :dbname "perf" :create true}) + (def db-spec {:dbtype "mysql" :dbname "worldsingles" :user "root" :password "visual"}) + (def con db-spec) + (def con (get-datasource db-spec)) + (get-connection con {}) + (def con (get-connection (get-datasource db-spec) {})) + (def con (get-connection db-spec {})) + (execute! con ["DROP TABLE fruit"]) + ;; h2 + (execute! con ["CREATE TABLE fruit (id int default 0, name varchar(32) primary key, appearance varchar(32), cost int, grade real)"]) + (execute! con ["INSERT INTO fruit (id,name,appearance,cost,grade) VALUES (1,'Apple','red',59,87), (2,'Banana','yellow',29,92.2), (3,'Peach','fuzzy',139,90.0), (4,'Orange','juicy',89,88.6)"]) + ;; mysql + (execute! con ["CREATE TABLE fruit (id int auto_increment, name varchar(32), appearance varchar(32), cost int, grade real, primary key (id))"]) + (execute! con ["INSERT INTO fruit (id,name,appearance,cost,grade) VALUES (1,'Apple','red',59,87), (2,'Banana','yellow',29,92.2), (3,'Peach','fuzzy',139,90.0), (4,'Orange','juicy',89,88.6)"] + {:return-keys true}) + + (.close con) + + (require '[criterium.core :refer [bench quick-bench]]) + + ;; calibrate + (quick-bench (reduce + (take 10e6 (range)))) + + ;; raw java + (defn select* [^java.sql.Connection con] + (let [ps (doto (.prepareStatement con "SELECT * FROM fruit WHERE appearance = ?") + (.setObject 1 "red")) + rs (.executeQuery ps) + _ (.next rs) + value (.getObject rs "name")] + (.close ps) + value)) + (quick-bench (select* con)) + + ;; almost same as the Java example above + (quick-bench + (reduce (fn [rs m] (reduced (:name m))) + nil + (reducible! con ["select * from fruit where appearance = ?" "red"]))) + (quick-bench + (execute-one! con + ["select * from fruit where appearance = ?" "red"] + {:row-fn :name})) + + ;; simple query + (quick-bench + (execute! con ["select * from fruit where appearance = ?" "red"])) + + (execute! con ["select * from fruit"]) + (into [] (map (partial into {})) (reducible! con ["select * from fruit"])) + + ;; with a prepopulated prepared statement + (with-open [ps (prepare con ["select * from fruit where appearance = ?" "red"] {})] + (quick-bench + [(reduce (fn [_ row] (reduced (:name row))) + nil + (reducible! ps))])) + + ;; same as above but setting parameters inside the benchmark + (with-open [ps (prepare con ["select * from fruit where appearance = ?"] {})] + (quick-bench + [(reduce (fn [_ row] (reduced (:name row))) + nil + (reducible! (prepare/set-parameters ps ["red"])))])) + + ;; this takes more than twice the time of the one above which seems strange + (with-open [ps (prepare con ["select * from fruit where appearance = ?"] {})] + (quick-bench + [(reduce (fn [_ row] (reduced (:name row))) + nil + (reducible! (prepare/set-parameters ps ["red"]))) + (reduce (fn [_ row] (reduced (:name row))) + nil + (reducible! (prepare/set-parameters ps ["fuzzy"])))])) + + ;; full first row + (quick-bench + (execute-one! con ["select * from fruit where appearance = ?" "red"])) + + ;; test assoc works + (execute-one! con + ["select * from fruit where appearance = ?" "red"] + {:row-fn #(assoc % :test :value)}) + + ;; test assoc works + (execute! con + ["select * from fruit where appearance = ?" "red"] + {:row-fn #(assoc % :test :value)}) + + (with-transaction [t con {:rollback-only? true}] + (execute! t ["INSERT INTO fruit (id,name,appearance,cost,grade) VALUES (5,'Pear','green',49,47)"]) + (execute! t ["select * from fruit where name = ?" "Pear"])) + (execute! con ["select * from fruit where name = ?" "Pear"]) + + (execute! con ["select * from membership"]))