Skip to content

Commit

Permalink
refactored with new clj-time, removed schema, and cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
priyatam committed Jan 8, 2020
1 parent f3f8e75 commit 416384c
Show file tree
Hide file tree
Showing 11 changed files with 136 additions and 118 deletions.
22 changes: 2 additions & 20 deletions src/pregres.clj
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,7 @@
(:require
[clojure.tools.logging :as log]
[pregres.db :as db]
[com.stuartsierra.component :as component]))
[pregres.types]))

(defrecord Database [db-spec connection]
component/Lifecycle
(start [component]
(if connection
component
(do (log/info "Starting database")
(let [conn (db/connect db-spec)]
(assoc component :connection conn)))))
(stop [component]
(if (not connection)
component
(do
(log/info "Stopping database")
(db/disconnect connection)
(assoc component :connection nil)))))
;; Note: importing pregres.types above registers sql/time coercions

(defn new-Database
"Create a new Database Component"
[db-spec]
(map->Database {:db-spec db-spec}))
71 changes: 0 additions & 71 deletions src/pregres/core/types.clj

This file was deleted.

7 changes: 4 additions & 3 deletions src/pregres/db.clj
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,12 @@
[cheshire.core :as json]
[clojure.string :as str]
[clojure.tools.logging :as log]
[clj-time.jdbc]
[hikari-cp.core :as hikari]
[pregres.core.utils :as utils]
[pregres.core.types :as types]))
[pregres.utils :as utils]
[pregres.types :as types]))


;; TODO Fine tune defaults
(defn connect
"Connect to the specified database and return a Connection backed by Hikari Pool.
If db-spec map is passed, connect to DATABASE_URL environment variable. If
Expand Down
5 changes: 2 additions & 3 deletions src/pregres/migrator.clj
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
(ns pregres.migrator
"SQL schema migration library"
(:require
[ragtime.jdbc :as jdbc]
[ragtime.repl :as repl])
(:require [ragtime.jdbc :as jdbc]
[ragtime.repl :as repl])
(:import (java.sql Timestamp)))

(defn load-config [env]
Expand Down
23 changes: 10 additions & 13 deletions src/pregres/queries.clj
Original file line number Diff line number Diff line change
@@ -1,18 +1,15 @@
(ns pregres.queries
(:refer-clojure :exclude [find read update])
(:require
[clojure.java.jdbc :as jdbc]
[clojure.string :as str]
[clojure.java.io :as io]
[hikari-cp.core :as hikari]
[pregres.db :as db]
[pregres.core.utils :as utils])
(:import
[java.sql Timestamp]
[java.util Date UUID]
[org.postgresql.jdbc4 Jdbc4Array]
[org.postgresql.util PGobject]
[java.net.URI]))
(:require [clojure.java.jdbc :as jdbc]
[clojure.string :as str]
[clojure.java.io :as io]
[hikari-cp.core :as hikari]
[pregres.db :as db]
[pregres.utils :as utils])
(:import [java.sql Timestamp]
[java.util Date UUID]
[org.postgresql.util PGobject]
[java.net URI]))

;; Helpers -----

Expand Down
4 changes: 2 additions & 2 deletions src/pregres/transactor.clj
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
(:require
[clojure.java.jdbc :as jdbc]
[clojure.string :as str]
[pregres.core.utils :as utils]
[pregres.utils :as utils]
[pregres.db :as db]
[clj-time.jdbc])
[pregres.types])
(:import
[java.sql Timestamp]
[java.util Date UUID]))
Expand Down
111 changes: 111 additions & 0 deletions src/pregres/types.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
(ns pregres.types
(:refer-clojure :exclude [find read update])
(:require [clojure.string :as str]
[clojure.java.jdbc :as jdbc]
[cheshire.core :as json]
[java-time :as dt]
[java-time.format :as dtf]
[pregres.utils :as utils])
(:import [java.net URI]
[java.sql Array Timestamp]
[java.util Date UUID]
[java.time LocalDate LocalDateTime LocalTime ZoneId]
[java.time.format DateTimeFormatter]
[org.postgresql.util PGobject]))


(defprotocol ICoerce
(to-date-time ^LocalDateTime [obj] "Convert any `obj` to a DateTime instance."))


(defn ->uuid [^String s]
(UUID/fromString s))

(defn ->pg-object [^String type ^String value]
(doto (PGobject.)
(.setType type)
(.setValue value)))

(defn ->json-pg-object [val]
(doto (PGobject.)
(.setType "jsonb")
(.setValue (if (string? val) val
(json/encode val)))))

(defn json-pg-object->clj [^PGobject pg-obj]
(json/decode (.getValue pg-obj) keyword))

(defn ->pg-uuid-array [conn coll]
(let [coll (map #(UUID/fromString %) coll)]
(.createArrayOf conn "uuid" (into-array coll))))

(defn pg-array->vec [^Array j4a]
(vec (.getArray ^Array j4a)))


;; Protocol Extensions

;; SQL -> CLJ
(extend-protocol jdbc/IResultSetReadColumn

Array
(result-set-read-column [jdbc-arr _ _]
(vec (.getArray jdbc-arr)))

Timestamp
(result-set-read-column [ts _ _]
(.getTime ^Timestamp ts))

UUID
(result-set-read-column [uuid _ _]
(str uuid))

PGobject
(result-set-read-column [pg-obj _ _]
(case (.getType pg-obj)
"json" (json-pg-object->clj pg-obj)
"jsonb" (json-pg-object->clj pg-obj)
pg-obj)))

;; CLJ -> SQL
(extend-protocol jdbc/ISQLValue
clojure.lang.IPersistentMap
(sql-value [val]
(->json-pg-object val))

clojure.lang.IPersistentVector
(sql-value [val]
(->json-pg-object val)))


(extend-protocol ICoerce
nil
(to-date-time [_]
nil)

Date
(to-date-time [date]
(when date
(dt/local-date (.toInstant date) (ZoneId/systemDefault))))

java.sql.Date
(to-date-time [sql-date]
(when sql-date
(.toLocalDate sql-date)))

java.sql.Timestamp
(to-date-time [sql-time]
(when sql-time
(.toLocalDate sql-time)))

Integer
(to-date-time [integer]
(dt/local-date (long integer) (ZoneId/systemDefault)))

Long
(to-date-time [longnum]
(dt/local-date longnum (ZoneId/systemDefault)))

String
(to-date-time [string]
(dt/local-date "FIXME" "2011-12-03T10:15:30Z" ))) ;; ISO_INSTANT
2 changes: 1 addition & 1 deletion src/pregres/core/utils.clj → src/pregres/utils.clj
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
(ns pregres.core.utils
(ns pregres.utils
(:require [clojure.string :as str])
(:import
java.io.ByteArrayOutputStream
Expand Down
2 changes: 1 addition & 1 deletion test/pregres/db_test.clj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
(ns pregres.db-test
(:require
[clojure.test :refer :all]
[pregres.core.fixtures :as fixtures]
[pregres.fixtures :as fixtures]
[pregres.db :refer :all]))

(use-fixtures :once fixtures/db)
Expand Down
5 changes: 2 additions & 3 deletions src/pregres/core/fixtures.clj → test/pregres/fixtures.clj
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
(ns pregres.core.fixtures
(:require [clojure.test :refer :all]
[schema.core :as s]
(ns pregres.fixtures
(:require [clojure.test :as test]
[pregres.db :as db]))

(defn db [f]
Expand Down
2 changes: 1 addition & 1 deletion test/pregres_test.clj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
(ns pregres-test
(:require
[clojure.test :refer :all]
[pregres.core.fixtures :as fixtures]
[pregres.fixtures :as fixtures]
[pregres :refer :all]))

(use-fixtures :once fixtures/db)
Expand Down

0 comments on commit 416384c

Please sign in to comment.