From a8ad79d0e6169f404445692b8f16ad3e435b9eab Mon Sep 17 00:00:00 2001 From: Nick Alexander Date: Tue, 11 Oct 2016 20:25:40 -0700 Subject: [PATCH] Make !]]]) + [clojure.core.async :as a :refer [chan go go-loop !]]]) #?@(:cljs [[datomish.pair-chan] [cljs.core.async :as a :refer [chan !]]])) #?(:clj @@ -45,9 +45,11 @@ [conn] "Get the full transaction history DB associated with this connection.")) -(defrecord Connection [current-db] +(defrecord Connection [current-db transact-chan] IConnection - (close [conn] (db/close-db @(:current-db conn))) + (close [conn] + (a/close! (:transact-chan conn)) + (db/close-db @(:current-db conn))) (db [conn] @(:current-db conn)) @@ -98,12 +100,15 @@ ;; #?(:cljs ;; (doseq [[tag cb] data-readers] (cljs.reader/register-tag-parser! tag cb))) -;; TODO: implement support for DB parts? +(declare start-transactor) (defn connection-with-db [db] - (map->Connection {:current-db (atom db)})) - -;; ;; TODO: persist max-tx and max-eid in SQLite. + (let [connection + (map->Connection {:current-db (atom db) + :transact-chan (a/chan (util/unlimited-buffer)) + })] + (start-transactor connection) + connection)) (defn maybe-datom->entity [entity] (cond @@ -552,12 +557,34 @@ (:db-after (! token-chan (gensym "transactor-token")) + (loop [] + (let [token ( (! result pair)) + (a/close! result) + (>! token-chan token) + (recur))))))) diff --git a/test/datomish/test.cljs b/test/datomish/test.cljs index 92eb9430..ae43bf10 100644 --- a/test/datomish/test.cljs +++ b/test/datomish/test.cljs @@ -9,6 +9,7 @@ datomish.schema-test datomish.sqlite-user-version-test datomish.tofinoish-test + datomish.transact-test datomish.util-test datomish.test.transforms datomish.test.query @@ -23,6 +24,7 @@ 'datomish.schema-test 'datomish.sqlite-user-version-test 'datomish.tofinoish-test + 'datomish.transact-test 'datomish.util-test 'datomish.test.transforms 'datomish.test.query diff --git a/test/datomish/transact_test.cljc b/test/datomish/transact_test.cljc new file mode 100644 index 00000000..a23a2f25 --- /dev/null +++ b/test/datomish/transact_test.cljc @@ -0,0 +1,116 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. + +(ns datomish.transact-test + #?(:cljs + (:require-macros + [datomish.pair-chan :refer [go-pair = !]]]) + #?@(:cljs [[datomish.js-sqlite] + [datomish.pair-chan] + [datomish.test-macros :refer-macros [deftest-async deftest-db]] + [datomish.node-tempfile :refer [tempfile]] + [cljs.test :as t :refer-macros [is are deftest testing async]] + [cljs.core.async :as a :refer [!]]])) + #?(:clj + (:import [clojure.lang ExceptionInfo])) + #?(:clj + (:import [datascript.db DB]))) + +#?(:cljs + (def Throwable js/Error)) + +(defn- tempids [tx] + (into {} (map (juxt (comp :idx first) second) (:tempids tx)))) + +(def test-schema + [{:db/id (d/id-literal :db.part/user) + :db/ident :x + :db/unique :db.unique/identity + :db/valueType :db.type/long + :db.install/_attribute :db.part/db} + {:db/id (d/id-literal :db.part/user) + :db/ident :name + :db/unique :db.unique/identity + :db/valueType :db.type/string + :db.install/_attribute :db.part/db} + {:db/id (d/id-literal :db.part/user) + :db/ident :y + :db/cardinality :db.cardinality/many + :db/valueType :db.type/long + :db.install/_attribute :db.part/db} + {:db/id (d/id-literal :db.part/user) + :db/ident :aka + :db/cardinality :db.cardinality/many + :db/valueType :db.type/string + :db.install/_attribute :db.part/db} + {:db/id (d/id-literal :db.part/user) + :db/ident :age + :db/valueType :db.type/long + :db.install/_attribute :db.part/db} + {:db/id (d/id-literal :db.part/user) + :db/ident :email + :db/unique :db.unique/identity + :db/valueType :db.type/string + :db.install/_attribute :db.part/db} + {:db/id (d/id-literal :db.part/user) + :db/ident :spouse + :db/unique :db.unique/value + :db/valueType :db.type/string + :db.install/_attribute :db.part/db} + {:db/id (d/id-literal :db.part/user) + :db/ident :friends + :db/cardinality :db.cardinality/many + :db/valueType :db.type/ref + :db.install/_attribute :db.part/db} + ]) + +(deftest-db test-overlapping-transacts conn + (let [{tx0 :tx} ( [[id0 :email (str "@" %) (+ 3 % tx0) 0] + [id0 :email (str "@" (inc %)) (+ 3 % tx0) 1]]) + (range 0 (dec n)))) + + (filter #(not= :db/txInstant (second %)) (