Skip to content
Snippets Groups Projects
Commit 4e3057ac authored by Cam Saul's avatar Cam Saul
Browse files

add `with-temp-db` macro.

parent 54bc03c2
No related branches found
No related tags found
No related merge requests found
......@@ -14,6 +14,7 @@
(catch-api-exceptions 0)
(check 1)
(context 2)
(create-database-definition 1)
(execute-query 1)
(expect 1)
(expect-eval-actual-first 1)
......
......@@ -72,7 +72,7 @@
DATASET-LOADER should be an object that implements `IDatasetLoader`."
[dataset-loader ^DatabaseDefinition database-definition]
;; Delete the Metabase Database and associated objects
(cascade-delete (metabase-instance database-definition (engine dataset-loader)))
(cascade-delete Database :id (:id (metabase-instance database-definition (engine dataset-loader))))
;; now delete the DBMS database
(drop-physical-db! dataset-loader database-definition))
......@@ -122,34 +122,16 @@
(sel :one Table :id (table->id (s/upper-case (name table-name)))))
;; ## TODO! with-temp-table and related macros
;; DEPRECATED ! Need to rewrite this to use the new TableDefinition stuff
;; (defmacro with-temp-table
;; "Execute BODY with a temporary Table that will be dropped afterward.
;; The korma entity representing the Table is bound to TABLE-BINDING.
;; FIELDS-MAP should be a map of FIELD-NAME -> SQL-TYPE.
;; (with-temp-table [table {:name \"VARCHAR(254)\"}]
;; (insert table (values [{:name \"A\"}
;; {:name \"B\"}]))
;; (select table values (where {:name \"A\"})))"
;; [[table-binding fields-map] & body]
;; {:pre [(map? fields-map)]}
;; (let [table-name (name (gensym "TABLE__"))
;; formatted-fields (->> fields-map
;; (map (fn [[field-name field-type]]
;; (format "\"%s\" %s" (.toUpperCase ^String (name field-name)) (name field-type))))
;; (interpose ", ")
;; (reduce str))]
;; `(do (get-or-create-database! (h2/dataset-loader) data/test-data)
;; (h2/exec-sql data/test-data (format "DROP TABLE IF EXISTS \"%s\";" ~table-name))
;; (h2/exec-sql data/test-data (format "CREATE TABLE \"%s\" (%s, \"ID\" BIGINT AUTO_INCREMENT, PRIMARY KEY (\"ID\"));" ~table-name ~formatted-fields))
;; (let [~table-binding (h2/korma-entity (map->TableDefinition {:table-name ~table-name})
;; data/test-data)]
;; (try
;; ~@body
;; (catch Throwable e#
;; (println "E: " e#))
;; (finally
;; (h2/exec-sql data/test-data (format "DROP TABLE \"%s\";" ~table-name))))))))
;; ## Temporary Dataset Macros
(defmacro with-temp-db
"Load and sync DATABASE-DEFINITION with DATASET-LOADER and execute BODY with
the newly created `Database` bound to DB-BINDING.
Remove `Database` and destroy data afterward."
[[db-binding dataset-loader ^DatabaseDefinition database-definition] & body]
`(let [loader# ~dataset-loader
dbdef# ~database-definition]
(try (let [~db-binding (get-or-create-database! loader# dbdef#)]
~@body)
(finally
(remove-database! loader# dbdef#)))))
......@@ -1283,40 +1283,39 @@
;; ## Default Dataset DatabaseDefinition
(def ^DatabaseDefinition test-data
(create-database-definition
"Test Database"
["users" [{:field-name "name"
:base-type :CharField}
{:field-name "last_login"
:base-type :DateTimeField}
{:field-name "password"
:base-type :CharField
:field-type :sensitive}]
users]
["categories" [{:field-name "name"
:base-type :CharField}]
categories]
["venues" [{:field-name "name"
:base-type :CharField}
{:field-name "latitude"
:base-type :FloatField
:special-type :latitude}
{:field-name "longitude"
:base-type :FloatField
:special-type :longitude}
{:field-name "price"
:base-type :IntegerField
:special-type :category}
{:field-name "category_id"
:base-type :IntegerField
:fk :categories}]
venues]
["checkins" [{:field-name "user_id"
:base-type :IntegerField
:fk :users}
{:field-name "venue_id"
:base-type :IntegerField
:fk :venues}
{:field-name "date"
:base-type :DateField}]
checkins]))
(create-database-definition "Test Database"
["users" [{:field-name "name"
:base-type :CharField}
{:field-name "last_login"
:base-type :DateTimeField}
{:field-name "password"
:base-type :CharField
:field-type :sensitive}]
users]
["categories" [{:field-name "name"
:base-type :CharField}]
categories]
["venues" [{:field-name "name"
:base-type :CharField}
{:field-name "latitude"
:base-type :FloatField
:special-type :latitude}
{:field-name "longitude"
:base-type :FloatField
:special-type :longitude}
{:field-name "price"
:base-type :IntegerField
:special-type :category}
{:field-name "category_id"
:base-type :IntegerField
:fk :categories}]
venues]
["checkins" [{:field-name "user_id"
:base-type :IntegerField
:fk :users}
{:field-name "venue_id"
:base-type :IntegerField
:fk :venues}
{:field-name "date"
:base-type :DateField}]
checkins]))
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment