Prep for 1.0.476

Extend default options behavior to `next.jdbc.sql` functions.
This commit is contained in:
Sean Corfield 2020-06-22 23:16:05 -07:00
parent ffc15fb1f6
commit 85734ab724
6 changed files with 70 additions and 57 deletions

View file

@ -4,6 +4,9 @@ Only accretive/fixative changes will be made from now on.
## Stable Builds
* 2020-06-22 -- 1.0.476
* Extend default options behavior to `next.jdbc.sql` functions.
* 2020-06-22 -- 1.0.475
* Add tests for `"jtds"` database driver (against MS SQL Server), making it officially supported.
* Switch from OpenTable Embedded PostgreSQL to Zonky's version, so that testing can move forward from PostgreSQL 10.11 to 12.2.0.

View file

@ -6,7 +6,7 @@ The next generation of `clojure.java.jdbc`: a new low-level Clojure wrapper for
The latest versions on Clojars and on cljdoc:
[![Clojars Project](https://clojars.org/seancorfield/next.jdbc/latest-version.svg)](https://clojars.org/seancorfield/next.jdbc) [![cljdoc badge](https://cljdoc.org/badge/seancorfield/next.jdbc?1.0.475)](https://cljdoc.org/d/seancorfield/next.jdbc/CURRENT)
[![Clojars Project](https://clojars.org/seancorfield/next.jdbc/latest-version.svg)](https://clojars.org/seancorfield/next.jdbc) [![cljdoc badge](https://cljdoc.org/badge/seancorfield/next.jdbc?1.0.476)](https://cljdoc.org/d/seancorfield/next.jdbc/CURRENT)
The documentation on [cljdoc.org](https://cljdoc.org/d/seancorfield/next.jdbc/CURRENT) is for the current version of `next.jdbc`:
@ -14,7 +14,7 @@ The documentation on [cljdoc.org](https://cljdoc.org/d/seancorfield/next.jdbc/CU
* [Migrating from `clojure.java.jdbc`](https://cljdoc.org/d/seancorfield/next.jdbc/CURRENT/doc/migration-from-clojure-java-jdbc)
* Feedback via [issues](https://github.com/seancorfield/next-jdbc/issues) or in the [`#sql` channel on the Clojurians Slack](https://clojurians.slack.com/messages/C1Q164V29/details/) or the [`#sql` stream on the Clojurians Zulip](https://clojurians.zulipchat.com/#narrow/stream/152063-sql).
The documentation on GitHub is for **develop** since the 1.0.475 release -- [see the CHANGELOG](https://github.com/seancorfield/next-jdbc/blob/develop/CHANGELOG.md) and then read the [corresponding updated documentation](https://github.com/seancorfield/next-jdbc/tree/develop/doc) on GitHub if you want.
The documentation on GitHub is for **develop** since the 1.0.476 release -- [see the CHANGELOG](https://github.com/seancorfield/next-jdbc/blob/develop/CHANGELOG.md) and then read the [corresponding updated documentation](https://github.com/seancorfield/next-jdbc/tree/develop/doc) on GitHub if you want.
This project follows the version scheme MAJOR.MINOR.COMMITS where MAJOR and MINOR provide some relative indication of the size of the change, but do not follow semantic versioning. In general, all changes endeavor to be non-breaking (by moving to new names rather than by breaking existing names). COMMITS is an ever-increasing counter of commits since the beginning of this repository.

View file

@ -9,12 +9,12 @@ It is designed to work with Clojure 1.10 or later, supports `datafy`/`nav`, and
You can add `next.jdbc` to your project with either:
```clojure
seancorfield/next.jdbc {:mvn/version "1.0.475"}
seancorfield/next.jdbc {:mvn/version "1.0.476"}
```
for `deps.edn` or:
```clojure
[seancorfield/next.jdbc "1.0.475"]
[seancorfield/next.jdbc "1.0.476"]
```
for `project.clj` or `build.boot`.
@ -29,7 +29,7 @@ For the examples in this documentation, we will use a local H2 database on disk,
```clojure
;; deps.edn
{:deps {org.clojure/clojure {:mvn/version "1.10.1"}
seancorfield/next.jdbc {:mvn/version "1.0.475"}
seancorfield/next.jdbc {:mvn/version "1.0.476"}
com.h2database/h2 {:mvn/version "1.4.199"}}}
```

View file

@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>seancorfield</groupId>
<artifactId>next.jdbc</artifactId>
<version>1.0.475</version>
<version>1.0.476</version>
<name>next.jdbc</name>
<description>The next generation of clojure.java.jdbc: a new low-level Clojure wrapper for JDBC-based access to databases.</description>
<url>https://github.com/seancorfield/next-jdbc</url>
@ -22,7 +22,7 @@
<url>https://github.com/seancorfield/next-jdbc</url>
<connection>scm:git:git://github.com/seancorfield/next-jdbc.git</connection>
<developerConnection>scm:git:ssh://git@github.com/seancorfield/next-jdbc.git</developerConnection>
<tag>v1.0.475</tag>
<tag>v1.0.476</tag>
</scm>
<dependencies>
<dependency>

View file

@ -37,9 +37,10 @@
([connectable table key-map]
(insert! connectable table key-map {}))
([connectable table key-map opts]
(execute-one! connectable
(for-insert table key-map opts)
(merge {:return-keys true} opts))))
(let [opts (merge (:options connectable) opts)]
(execute-one! connectable
(for-insert table key-map opts)
(merge {:return-keys true} opts)))))
(defn insert-multi!
"Syntactic sugar over `execute!` to make inserting columns/rows easier.
@ -57,9 +58,10 @@
(insert-multi! connectable table cols rows {}))
([connectable table cols rows opts]
(if (seq rows)
(execute! connectable
(for-insert-multi table cols rows opts)
(merge {:return-keys true} opts))
(let [opts (merge (:options connectable) opts)]
(execute! connectable
(for-insert-multi table cols rows opts)
(merge {:return-keys true} opts)))
[])))
(defn query
@ -70,7 +72,8 @@
([connectable sql-params]
(query connectable sql-params {}))
([connectable sql-params opts]
(execute! connectable sql-params opts)))
(let [opts (merge (:options connectable) opts)]
(execute! connectable sql-params opts))))
(defn find-by-keys
"Syntactic sugar over `execute!` to make certain common queries easier.
@ -85,7 +88,8 @@
([connectable table key-map]
(find-by-keys connectable table key-map {}))
([connectable table key-map opts]
(execute! connectable (for-query table key-map opts) opts)))
(let [opts (merge (:options connectable) opts)]
(execute! connectable (for-query table key-map opts) opts))))
(defn get-by-id
"Syntactic sugar over `execute-one!` to make certain common queries easier.
@ -100,7 +104,8 @@
([connectable table pk opts]
(get-by-id connectable table pk :id opts))
([connectable table pk pk-name opts]
(execute-one! connectable (for-query table {pk-name pk} opts) opts)))
(let [opts (merge (:options connectable) opts)]
(execute-one! connectable (for-query table {pk-name pk} opts) opts))))
(defn update!
"Syntactic sugar over `execute-one!` to make certain common updates easier.
@ -111,9 +116,10 @@
([connectable table key-map where-params]
(update! connectable table key-map where-params {}))
([connectable table key-map where-params opts]
(execute-one! connectable
(for-update table key-map where-params opts)
opts)))
(let [opts (merge (:options connectable) opts)]
(execute-one! connectable
(for-update table key-map where-params opts)
opts))))
(defn delete!
"Syntactic sugar over `execute-one!` to make certain common deletes easier.
@ -124,4 +130,5 @@
([connectable table where-params]
(delete! connectable table where-params {}))
([connectable table where-params opts]
(execute-one! connectable (for-delete table where-params opts) opts)))
(let [opts (merge (:options connectable) opts)]
(execute-one! connectable (for-delete table where-params opts) opts))))

View file

@ -3,6 +3,7 @@
(ns next.jdbc.sql-test
"Tests for the syntactic sugar SQL functions."
(:require [clojure.test :refer [deftest is testing use-fixtures]]
[next.jdbc :as jdbc]
[next.jdbc.specs :as specs]
[next.jdbc.sql :as sql]
[next.jdbc.test-fixtures
@ -16,8 +17,8 @@
(specs/instrument)
(deftest test-query
(let [rs (sql/query (ds) ["select * from fruit order by id"]
(default-options))]
(let [ds-opts (jdbc/with-options (ds) (default-options))
rs (sql/query ds-opts ["select * from fruit order by id"])]
(is (= 4 (count rs)))
(is (every? map? rs))
(is (every? meta rs))
@ -25,45 +26,47 @@
(is (= 4 ((column :FRUIT/ID) (last rs))))))
(deftest test-find-by-keys
(let [rs (sql/find-by-keys (ds) :fruit {:appearance "neon-green"})]
(is (vector? rs))
(is (= [] rs)))
(let [rs (sql/find-by-keys (ds) :fruit {:appearance "yellow"}
(default-options))]
(is (= 1 (count rs)))
(is (every? map? rs))
(is (every? meta rs))
(is (= 2 ((column :FRUIT/ID) (first rs))))))
(let [ds-opts (jdbc/with-options (ds) (default-options))]
(let [rs (sql/find-by-keys ds-opts :fruit {:appearance "neon-green"})]
(is (vector? rs))
(is (= [] rs)))
(let [rs (sql/find-by-keys ds-opts :fruit {:appearance "yellow"})]
(is (= 1 (count rs)))
(is (every? map? rs))
(is (every? meta rs))
(is (= 2 ((column :FRUIT/ID) (first rs)))))))
(deftest test-get-by-id
(is (nil? (sql/get-by-id (ds) :fruit -1)))
(let [row (sql/get-by-id (ds) :fruit 3 (default-options))]
(is (map? row))
(is (= "Peach" ((column :FRUIT/NAME) row))))
(let [row (sql/get-by-id (ds) :fruit "juicy" :appearance (default-options))]
(is (map? row))
(is (= 4 ((column :FRUIT/ID) row)))
(is (= "Orange" ((column :FRUIT/NAME) row))))
(let [row (sql/get-by-id (ds) :fruit "Banana" :FRUIT/NAME (default-options))]
(is (map? row))
(is (= 2 ((column :FRUIT/ID) row)))))
(let [ds-opts (jdbc/with-options (ds) (default-options))]
(is (nil? (sql/get-by-id ds-opts :fruit -1)))
(let [row (sql/get-by-id ds-opts :fruit 3)]
(is (map? row))
(is (= "Peach" ((column :FRUIT/NAME) row))))
(let [row (sql/get-by-id ds-opts :fruit "juicy" :appearance {})]
(is (map? row))
(is (= 4 ((column :FRUIT/ID) row)))
(is (= "Orange" ((column :FRUIT/NAME) row))))
(let [row (sql/get-by-id ds-opts :fruit "Banana" :FRUIT/NAME {})]
(is (map? row))
(is (= 2 ((column :FRUIT/ID) row))))))
(deftest test-update!
(try
(is (= {:next.jdbc/update-count 1}
(sql/update! (ds) :fruit {:appearance "brown"} {:id 2})))
(is (= "brown" ((column :FRUIT/APPEARANCE)
(sql/get-by-id (ds) :fruit 2 (default-options)))))
(finally
(sql/update! (ds) :fruit {:appearance "yellow"} {:id 2})))
(try
(is (= {:next.jdbc/update-count 1}
(sql/update! (ds) :fruit {:appearance "green"}
["name = ?" "Banana"])))
(is (= "green" ((column :FRUIT/APPEARANCE)
(sql/get-by-id (ds) :fruit 2 (default-options)))))
(finally
(sql/update! (ds) :fruit {:appearance "yellow"} {:id 2}))))
(let [ds-opts (jdbc/with-options (ds) (default-options))]
(try
(is (= {:next.jdbc/update-count 1}
(sql/update! ds-opts :fruit {:appearance "brown"} {:id 2})))
(is (= "brown" ((column :FRUIT/APPEARANCE)
(sql/get-by-id ds-opts :fruit 2))))
(finally
(sql/update! ds-opts :fruit {:appearance "yellow"} {:id 2})))
(try
(is (= {:next.jdbc/update-count 1}
(sql/update! ds-opts :fruit {:appearance "green"}
["name = ?" "Banana"])))
(is (= "green" ((column :FRUIT/APPEARANCE)
(sql/get-by-id ds-opts :fruit 2))))
(finally
(sql/update! ds-opts :fruit {:appearance "yellow"} {:id 2})))))
(deftest test-insert-delete
(let [new-key (cond (derby?) :1