|
1 | 1 | (ns clojure-game-geek.db
|
2 | 2 | (:require
|
3 | 3 | [com.stuartsierra.component :as component]
|
4 |
| - [postgres.async :refer [open-db close-db!] :as pa] |
5 |
| - [clojure.core.async :refer [<!!]] |
6 | 4 | [io.pedestal.log :as log]
|
7 |
| - [clojure.string :as str])) |
| 5 | + [clojure.java.jdbc :as jdbc] |
| 6 | + [clojure.string :as str]) |
| 7 | + (:import (com.mchange.v2.c3p0 ComboPooledDataSource))) |
8 | 8 |
|
9 |
| -(defrecord ClojureGameGeekDb [conn] |
| 9 | +(defn ^:private pooled-data-source |
| 10 | + [host dbname user password port] |
| 11 | + {:datasource |
| 12 | + (doto (ComboPooledDataSource.) |
| 13 | + (.setDriverClass "org.postgresql.Driver") |
| 14 | + (.setJdbcUrl (str "jdbc:postgresql://" host ":" port "/" dbname)) |
| 15 | + (.setUser user) |
| 16 | + (.setPassword password))}) |
| 17 | + |
| 18 | +(defrecord ClojureGameGeekDb [ds] |
10 | 19 |
|
11 | 20 | component/Lifecycle
|
12 | 21 |
|
13 | 22 | (start [this]
|
14 | 23 | (assoc this
|
15 |
| - :conn (open-db {:hostname "localhost" |
16 |
| - :database "cggdb" |
17 |
| - :username "cgg_role" |
18 |
| - :password "lacinia" |
19 |
| - ;; Host port mapped to 5432 in the container |
20 |
| - :port 25432}))) |
| 24 | + :ds (pooled-data-source "localhost" "cggdb" "cgg_role" "lacinia" 25432))) |
21 | 25 |
|
22 | 26 | (stop [this]
|
23 |
| - (close-db! conn) |
24 |
| - (assoc this :conn nil))) |
| 27 | + (-> ds :datasource .close) |
| 28 | + (assoc this :ds nil))) |
25 | 29 |
|
26 | 30 | (defn new-db
|
27 | 31 | []
|
28 | 32 | {:db (map->ClojureGameGeekDb {})})
|
29 | 33 |
|
30 |
| -(defn ^:private take! |
31 |
| - "Takes a value from a channel and rethrows an exception if that is the |
32 |
| - conveyed value." |
33 |
| - [ch] |
34 |
| - (let [v (<!! ch)] |
35 |
| - (if (instance? Throwable v) |
36 |
| - (throw v) |
37 |
| - v))) |
38 | 34 |
|
39 |
| -(defn ^:private query! |
| 35 | +(defn ^:private query |
40 | 36 | [component statement]
|
41 | 37 | (let [[sql & params] statement]
|
42 | 38 | (log/debug :sql (str/replace sql #"\s+" " ")
|
43 | 39 | :params params))
|
44 |
| - (pa/query! (:conn component) statement)) |
| 40 | + (jdbc/query (:ds component) statement)) |
45 | 41 |
|
46 | 42 | (defn find-game-by-id
|
47 | 43 | [component game-id]
|
48 |
| - (-> (query! component |
49 |
| - ["select game_id, name, summary, min_players, max_players, created_at, updated_at |
50 |
| - from board_game where game_id = $1" game-id]) |
51 |
| - take! |
52 |
| - first)) |
| 44 | + (first |
| 45 | + (query component |
| 46 | + ["select game_id, name, summary, min_players, max_players, created_at, updated_at |
| 47 | + from board_game where game_id = ?" game-id]))) |
53 | 48 |
|
54 | 49 | (defn find-member-by-id
|
55 | 50 | [component member-id]
|
56 |
| - (-> (query! component |
57 |
| - ["select member_id, name, created_at, updated_at |
58 |
| - from member |
59 |
| - where member_id = $1" member-id]) |
60 |
| - take! |
61 |
| - first)) |
| 51 | + (first |
| 52 | + (query component |
| 53 | + ["select member_id, name, created_at, updated_at |
| 54 | + from member |
| 55 | + where member_id = $1" member-id]))) |
62 | 56 |
|
63 | 57 | (defn list-designers-for-game
|
64 | 58 | [component game-id]
|
65 |
| - (take! |
66 |
| - (query! component |
67 |
| - ["select d.designer_id, d.name, d.uri, d.created_at, d.updated_at |
68 |
| - from designer d |
69 |
| - inner join designer_to_game j on (d.designer_id = j.designer_id) |
70 |
| - where j.game_id = $1 |
71 |
| - order by d.name" game-id]))) |
| 59 | + (query component |
| 60 | + ["select d.designer_id, d.name, d.uri, d.created_at, d.updated_at |
| 61 | + from designer d |
| 62 | + inner join designer_to_game j on (d.designer_id = j.designer_id) |
| 63 | + where j.game_id = $1 |
| 64 | + order by d.name" game-id])) |
72 | 65 |
|
73 | 66 | (defn list-games-for-designer
|
74 | 67 | [component designer-id]
|
75 |
| - (take! |
76 |
| - (query! component |
77 |
| - ["select g.game_id, g.name, g.summary, g.min_players, g.max_players, g.created_at, g.updated_at |
78 |
| - from board_game g |
79 |
| - inner join designer_to_game j on (g.game_id = j.game_id) |
80 |
| - where j.designer_id = $1 |
81 |
| - order by g.name" designer-id]))) |
| 68 | + (query component |
| 69 | + ["select g.game_id, g.name, g.summary, g.min_players, g.max_players, g.created_at, g.updated_at |
| 70 | + from board_game g |
| 71 | + inner join designer_to_game j on (g.game_id = j.game_id) |
| 72 | + where j.designer_id = $1 |
| 73 | + order by g.name" designer-id])) |
82 | 74 |
|
83 | 75 | (defn list-ratings-for-game
|
84 | 76 | [component game-id]
|
85 |
| - (take! |
86 |
| - (query! component |
87 |
| - ["select game_id, member_id, rating, created_at, updated_at |
88 |
| - from game_rating |
89 |
| - where game_id = $1" game-id]))) |
| 77 | + (query component |
| 78 | + ["select game_id, member_id, rating, created_at, updated_at |
| 79 | + from game_rating |
| 80 | + where game_id = $1" game-id])) |
90 | 81 |
|
91 | 82 | (defn list-ratings-for-member
|
92 | 83 | [component member-id]
|
93 |
| - (take! |
94 |
| - (query! component |
95 |
| - ["select game_id, member_id, rating, created_at, updated_at |
96 |
| - from game_rating |
97 |
| - where member_id = $1" member-id]))) |
| 84 | + (query component |
| 85 | + ["select game_id, member_id, rating, created_at, updated_at |
| 86 | + from game_rating |
| 87 | + where member_id = $1" member-id])) |
98 | 88 |
|
99 | 89 | (defn upsert-game-rating
|
100 |
| - "Adds a new game rating, or changes the value of an existing game rating." |
| 90 | + "Adds a new game rating, or changes the value of an existing game rating. |
| 91 | +
|
| 92 | + Returns nil" |
101 | 93 | [component game-id member-id rating]
|
102 |
| - (-> (query! component |
103 |
| - ["insert into game_rating (game_id, member_id, rating) |
104 |
| - values ($1, $2, $3) |
105 |
| - on conflict (game_id, member_id) do update set rating = $3" |
106 |
| - game-id member-id rating]) |
107 |
| - take! |
108 |
| - first)) |
| 94 | + (query component |
| 95 | + ["insert into game_rating (game_id, member_id, rating) |
| 96 | + values ($1, $2, $3) |
| 97 | + on conflict (game_id, member_id) do update set rating = $3" |
| 98 | + game-id member-id rating]) |
| 99 | + |
| 100 | + nil) |
0 commit comments