Skip to content

Commit

Permalink
Add database drivers
Browse files Browse the repository at this point in the history
  • Loading branch information
r0man committed Dec 7, 2015
1 parent 8ce3e57 commit 9d84dcc
Show file tree
Hide file tree
Showing 8 changed files with 152 additions and 3 deletions.
7 changes: 7 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
language: clojure
script: lein ci
sudo: false
addons:
postgresql: "9.4"
before_script:
- psql -c "CREATE DATABASE sqlingvo;" -U postgres
- psql -c "CREATE USER tiger SUPERUSER UNENCRYPTED PASSWORD 'scotch';" -U postgres
jdk:
- oraclejdk8
9 changes: 6 additions & 3 deletions project.clj
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,12 @@
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:deploy-repositories [["releases" :clojars]]
:dependencies [[org.clojure/clojure "1.7.0"]]
:profiles {:provided {:plugins [[jonase/eastwood "0.2.2"]
[lein-difftest "2.0.0"]]}}
:dependencies [[org.clojure/clojure "1.7.0"]
[org.postgresql/postgresql "9.4-1206-jdbc42"]]
:profiles {:dev {:dependencies [[funcool/clojure.jdbc "0.6.1"]
[org.clojure/java.jdbc "0.4.2"]]
:plugins [[jonase/eastwood "0.2.2"]
[lein-difftest "2.0.0"]]}}
:aliases {"lint" ["do" ["eastwood"]]
"ci" ["do" ["difftest"] ["lint"]]}
:eastwood {:exclude-linters [:suspicious-expression]})
11 changes: 11 additions & 0 deletions src/sqlingvo/driver.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
(ns sqlingvo.driver
(:require [sqlingvo.driver.core :refer [eval-db]]))

(defn make-db [db-spec]
(let [db (sqlingvo.db/postgresql db-spec)]
(assoc db :eval-fn eval-db)))

(try
(doseq [ns '[sqlingvo.driver.clojure sqlingvo.driver.funcool]]
(try (require ns)
(catch Exception _))))
19 changes: 19 additions & 0 deletions src/sqlingvo/driver/clojure.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
(ns sqlingvo.driver.clojure
(:require [clojure.java.jdbc :as jdbc]
[sqlingvo.driver.core :refer :all]
[sqlingvo.compiler :refer [compile-stmt]]))

(defmethod close-db 'clojure.java.jdbc [db]
(.close (:connection db)))

(defmethod eval-db* 'clojure.java.jdbc
[{:keys [db] :as ast}]
(let [sql (compile-stmt db ast)]
(case (:op ast)
:create-table (jdbc/execute! db sql)
:drop-table (jdbc/execute! db sql)
:insert (jdbc/execute! db sql)
:select (jdbc/query db sql))))

(defmethod open-db 'clojure.java.jdbc [db]
(assoc db :connection (jdbc/get-connection db)))
19 changes: 19 additions & 0 deletions src/sqlingvo/driver/core.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
(ns sqlingvo.driver.core
(:require [sqlingvo.core :refer [ast]]))

(defmulti close-db
"Close the connection to `db`."
(fn [db] (:backend db)))

(defmulti eval-db*
"Eval the `ast` against a database."
(fn [ast] (-> ast :db :backend)))

(defn eval-db
"Eval the `stmt` against a database."
[stmt]
(eval-db* (ast stmt)))

(defmulti open-db
"Open a connection to `db`."
(fn [db] (:backend db)))
19 changes: 19 additions & 0 deletions src/sqlingvo/driver/funcool.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
(ns sqlingvo.driver.funcool
(:require [jdbc.core :as jdbc]
[sqlingvo.driver.core :refer :all]
[sqlingvo.compiler :refer [compile-stmt]]))

(defmethod close-db 'jdbc.core [db]
(.close (:connection db)))

(defmethod eval-db* 'jdbc.core
[{:keys [db] :as ast}]
(let [sql (compile-stmt db ast)]
(case (:op ast)
:create-table (jdbc/execute db sql)
:drop-table (jdbc/execute db sql)
:insert (jdbc/execute db sql)
:select (jdbc/fetch db sql))))

(defmethod open-db 'jdbc.core [db]
(assoc db :connection (jdbc/connection db)))
50 changes: 50 additions & 0 deletions test/sqlingvo/driver_test.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
(ns sqlingvo.driver-test
(:refer-clojure :exclude [distinct group-by update])
(:require [clojure.test :refer :all]
[sqlingvo.core :refer :all]
[sqlingvo.driver :as driver]
[sqlingvo.test :refer [with-backends]]))

(defn create-countries
"Create the countries table."
[db]
@(create-table db :countries
(column :id :int)
(column :name :text)))

(defn insert-countries
"Insert countries into the table."
[db]
@(insert db :countries [:id :name]
(values [{:id 1 :name "Spain"}
{:id 2 :name "Germany"}
{:id 3 :name "France"}
{:id 4 :name "Portugal"}])))

(defn setup-countries [db]
@(drop-table db [:countries]
(if-exists true))
(create-countries db)
(insert-countries db))

(deftest test-select-countries
(with-backends [db]
(setup-countries db)
(is (= @(select db [:id :name]
(from :countries)
(order-by :id))
[{:id 1 :name "Spain"}
{:id 2 :name "Germany"}
{:id 3 :name "France"}
{:id 4 :name "Portugal"}]))))

(deftest test-select-countries-by-name
(with-backends [db]
(setup-countries db)
(is (= @(select db [:id :name]
(from :countries)
(where '(or (= :name "Spain")
(= :name "Portugal")))
(order-by :id))
[{:id 1 :name "Spain"}
{:id 4 :name "Portugal"}]))))
21 changes: 21 additions & 0 deletions test/sqlingvo/test.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
(ns sqlingvo.test
(:require [clojure.test :refer :all]
[sqlingvo.driver :refer [make-db]]
[sqlingvo.driver.core :refer [close-db open-db]]))

(def db
(make-db
{:vendor "postgresql"
:name "sqlingvo"
:host "localhost"
:user "tiger"
:password "scotch"
:subname "//localhost/sqlingvo"}))

(defmacro with-backends [[db-sym] & body]
`(doseq [backend# ['clojure.java.jdbc 'jdbc.core]]
(if (find-ns backend#)
(let [db# (open-db (assoc ~db :backend backend#)), ~db-sym db#]
(try (testing (str "Testing backend " (str backend#)) ~@body)
(finally (close-db db#))))
(.println *err* (format "WARNING: Can't find %s backend, skipping tests." backend#)))))

0 comments on commit 9d84dcc

Please sign in to comment.