Skip to content

Commit c659f6c

Browse files
committed
From MySQL to PostgreSQL
1 parent 1994d76 commit c659f6c

File tree

13 files changed

+124
-133
lines changed

13 files changed

+124
-133
lines changed

project.clj

+2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
[hiccup "1.0.5"]
3434

3535
;; db
36+
[mpg "1.3.0"]
37+
[org.postgresql/postgresql "9.4.1207"]
3638
[clojure.jdbc/clojure.jdbc-c3p0 "0.3.3"]
3739
[yesql "0.5.3"]
3840
;[org.clojure/java.jdbc "0.6.1"]

src/playground/db/core.clj

+11-2
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,13 @@
4242
:password (:password conf)
4343
:stringtype "unspecified"})
4444

45+
(defn create-db-spec-postgre [conf]
46+
{:subprotocol "postgresql"
47+
:subname (str "//" (:host conf) ":" (:port conf) "/" (:name conf))
48+
:classname "org.postgresql.Driver"
49+
:user (:user conf)
50+
:password (:password conf)})
51+
4552
(defrecord JDBC [config db-spec conn]
4653
component/Lifecycle
4754

@@ -50,7 +57,7 @@
5057
;(prn this)
5158
(if conn
5259
(assoc this :conn conn)
53-
(let [db-spec (create-db-spec config)
60+
(let [db-spec (create-db-spec-postgre config)
5461
conn (connection-pool db-spec)]
5562
(assoc this :db-spec db-spec :conn conn))))
5663

@@ -81,4 +88,6 @@
8188
;
8289
(defn insert-multiple! [db table data]
8390
(if (seq data)
84-
(clj-jdbc/insert-multi! (:conn db) table data {:entities (quoted \`)})))
91+
(clj-jdbc/insert-multi! (:conn db) table data
92+
;{:entities (quoted \`)}
93+
)))

src/playground/db/request.clj

+57-44
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@
77
[camel-snake-kebab.extras :as kebab-extra]
88
[playground.utils.utils :as utils]
99
[version-clj.core :as version-clj]
10-
[clojure.java.jdbc :as jdbc]))
10+
[clojure.java.jdbc :as jdbc]
11+
[mpg.core :as mpg]))
12+
13+
14+
(mpg/patch {:datetime false})
1115

1216
;; =====================================================================================================================
1317
;; Include sql files
@@ -28,20 +32,34 @@
2832
(defn dash->underscore [data]
2933
(kebab-extra/transform-keys kebab/->snake_case data))
3034

31-
(defn sql-sym [sym]
32-
(symbol (str 'sql- (name sym))))
33-
34-
(defmacro defsql
35-
"generate for each request something like:
36-
(defn versions [db & [params]
37-
(sql-versions params {:connection (:conn db)}))"
38-
[fn-name & [opts]]
39-
(if (ends-with? fn-name "<!")
40-
`(defn ~fn-name [db# & [params#]]
41-
(:generated_key
42-
(~(sql-sym fn-name) (dash->underscore params#) (merge {:connection (or (:conn db#) db#)} ~opts))))
43-
`(defn ~fn-name [db# & [params#]]
44-
(~(sql-sym fn-name) (dash->underscore params#) (merge {:connection (or (:conn db#) db#)} ~opts)))))
35+
(defn vec->arr [array-vector db]
36+
(.createArrayOf (jdbc/get-connection (:conn db))
37+
"varchar"
38+
(into-array String array-vector)))
39+
40+
(defn pg-params [data db]
41+
(reduce-kv (fn [res key val]
42+
(assoc res key
43+
(if (sequential? val)
44+
(vec->arr val db)
45+
val)))
46+
{}
47+
data))
48+
49+
;(defn sql-sym [sym]
50+
; (symbol (str 'sql- (name sym))))
51+
52+
;(defmacro defsql
53+
; "generate for each request something like:
54+
; (defn versions [db & [params]
55+
; (sql-versions params {:connection (:conn db)}))"
56+
; [fn-name & [opts]]
57+
; (if (ends-with? fn-name "<!")
58+
; `(defn ~fn-name [db# & [params#]]
59+
; (:generated_key
60+
; (~(sql-sym fn-name) (pg-params (dash->underscore params#) db#) (merge {:connection (or (:conn db#) db#)} ~opts))))
61+
; `(defn ~fn-name [db# & [params#]]
62+
; (~(sql-sym fn-name) (pg-params (dash->underscore params#) db#) (merge {:connection (or (:conn db#) db#)} ~opts)))))
4563

4664
(defmacro sql
4765
"generate for each request something like:
@@ -52,10 +70,9 @@
5270
opts (dissoc opts :name)]
5371
(if (ends-with? fn-name "<!")
5472
`(fn [db# & [params#]]
55-
(:generated_key
56-
(~fn-name (dash->underscore params#) (merge {:connection (or (:conn db#) db#)} ~opts))))
73+
(:id (~fn-name (pg-params (dash->underscore params#) db#) (merge {:connection (or (:conn db#) db#)} ~opts))))
5774
`(fn [db# & [params#]]
58-
(~fn-name (dash->underscore params#) (merge {:connection (or (:conn db#) db#)} ~opts))))))
75+
(~fn-name (pg-params (dash->underscore params#) db#) (merge {:connection (or (:conn db#) db#)} ~opts))))))
5976

6077
; TODO: maybe do something linke this:
6178
;(db-req/transaction (get-db request)
@@ -85,8 +102,8 @@
85102
;; =====================================================================================================================
86103
;; Versions
87104
;; =====================================================================================================================
88-
(defn parse-version [version]
89-
(update version :config parse-string true))
105+
;(defn parse-version [version]
106+
; (update version :config parse-string true))
90107

91108
(def versions (sql {:name sql-versions
92109
:row-fn underscore->dash
@@ -98,7 +115,8 @@
98115

99116
(def version-by-name (sql {:name sql-version-by-name
100117
:result-set-fn first
101-
:row-fn parse-version}))
118+
;:row-fn parse-version
119+
}))
102120

103121
(def add-version<! (sql {:name sql-add-version<!}))
104122

@@ -120,10 +138,10 @@
120138

121139
(defn parse-sample [sample]
122140
(-> sample
123-
(assoc :tags (parse-string (:tags sample)))
124-
(assoc :deleted-tags (parse-string (:deleted_tags sample)))
125-
(assoc :scripts (parse-string (:scripts sample)))
126-
(assoc :styles (parse-string (:styles sample)))
141+
;(assoc :tags (parse-string (:tags sample)))
142+
;(assoc :deleted-tags (parse-string (:deleted_tags sample)))
143+
;(assoc :scripts (parse-string (:scripts sample)))
144+
;(assoc :styles (parse-string (:styles sample)))
127145
underscore->dash
128146
add-full-url))
129147

@@ -177,20 +195,13 @@
177195
:short_description (:short-description sample)
178196

179197
:url (:url sample)
180-
:tags (generate-string (:tags sample))
181-
:deleted_tags (generate-string (:deleted-tags sample))
182-
:exports (:exports sample)
198+
:tags (vec (:tags sample))
199+
:deleted_tags (vec (:deleted-tags sample))
183200

184201
:owner_id (:owner-id sample)
185202

186-
:styles (when (seq (:styles sample))
187-
(generate-string (:styles sample)))
188-
189-
:scripts (when (seq (:scripts sample))
190-
(generate-string (:scripts sample)))
191-
192-
:local_scripts (when (seq (:local-scripts sample))
193-
(generate-string (:local-scripts sample)))
203+
:styles (vec (:styles sample))
204+
:scripts (vec (:scripts sample))
194205

195206
:code (:code sample)
196207
:code_type (:code-type sample)
@@ -204,10 +215,11 @@
204215
:version (or (:version sample) 0)})
205216

206217
(defn add-sample! [db sample]
207-
(add-sample<! db (insert-sample sample)))
218+
(let [s (insert-sample sample)]
219+
(add-sample<! db s)))
208220

209221
(defn add-samples! [db version-id samples]
210-
(doall (map :generated_key
222+
(doall (map :id ; :generated-key for MySQL
211223
(insert-multiple! db :samples (map #(insert-sample % version-id) samples)))))
212224

213225
(def delete-samples-by-ids! (sql {:name sql-delete-samples-by-ids!}))
@@ -300,14 +312,15 @@
300312
(def samples-by-tag (sql {:name sql-samples-by-tag
301313
:row-fn parse-sample}))
302314

303-
(def clear-tags-mw! (sql {:name sql-clear-tags-mw!}))
304-
305-
(def update-tags-mw! (sql {:name sql-update-tags-mw!}))
315+
;(def clear-tags-mw! (sql {:name sql-clear-tags-mw!}))
316+
;
317+
;(def update-tags-mw! (sql {:name sql-update-tags-mw!}))
306318

307319
(defn update-tags-mw [db]
308-
(jdbc/with-db-transaction [conn (:db-spec db)]
309-
(clear-tags-mw! conn {})
310-
(update-tags-mw! conn {})))
320+
;(jdbc/with-db-transaction [conn (:db-spec db)]
321+
; (clear-tags-mw! conn {})
322+
; (update-tags-mw! conn {}))
323+
)
311324

312325
;;======================================================================================================================
313326
;; Datasets, datasources

src/playground/generator/core.clj

+2-2
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,8 @@
172172
version-id (db-req/add-version<! db {:name (:name branch)
173173
:commit (:commit branch)
174174
:repo-id (:id @repo)
175-
:hidden true
176-
:config (json/generate-string version-config)
175+
:hidden false
176+
:config version-config
177177
:samples-count (count samples)})]
178178
(timbre/info "Insert samples: " (count samples) version-config)
179179
(when (seq samples)

src/playground/generator/data_sets.clj

+1-2
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,8 @@
6464
db-data {:name (:id data)
6565
:title (:name data)
6666
:type (:type data)
67-
:sets (:sets data)
6867
:url url}
69-
data-source-id (db-req/add-data-source<! db (update db-data :sets json/generate-string))
68+
data-source-id (db-req/add-data-source<! db db-data)
7069
full-db-data (assoc db-data :id data-source-id)]
7170
(doseq [data-set (:sets data)]
7271
(parse-data-set db full-db-data data-set)))))

src/playground/preview_generator/core.clj

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
(fn [{:keys [message attemp]}]
1414
(timbre/info "Preview generator redis message: " message)
1515
(when (seq message)
16-
(generate-previews generator message))
16+
;(generate-previews generator message)
17+
)
1718
{:status :success}))
1819

1920

src/sql/queries/datasets.sql

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
-- name: sql-add-data-source<!
2-
INSERT INTO data_sources (name, title, type, sets, url) VALUES (:name, :title, :type, :sets, :url);
2+
INSERT INTO data_sources (name, title, type, url) VALUES (:name, :title, :type, :url);
33

44
-- name: sql-add-data-set<!
55
INSERT INTO data_sets (logo, name, title, description, tags, source, sample, data_source_id, url, data)

src/sql/queries/repos.sql

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
-- name: sql-add-repo<!
2-
INSERT INTO repos (`name`, title, templates, `owner_id`) VALUES (:name, :title, :templates, :owner_id);
2+
INSERT INTO repos (name, title, templates, owner_id) VALUES (:name, :title, :templates, :owner_id);
33

44
-- name: sql-repos
55
SELECT * FROM repos ORDER BY title;
66

77
-- name: sql-repo-by-name
8-
SELECT * FROM repos WHERE `name` = :name;
8+
SELECT * FROM repos WHERE name = :name;

src/sql/queries/samples.sql

+25-23
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@ SELECT id FROM samples WHERE url = :url;
66

77

88
-- name: sql-samples-by-ids
9-
SELECT samples.*, versions.`name` as version_name, repos.name as repo_name FROM samples
9+
SELECT samples.*, versions.name as version_name, repos.name as repo_name FROM samples
1010
LEFT JOIN versions ON samples.version_id = versions.id
1111
LEFT JOIN repos ON versions.repo_id = repos.id
1212
WHERE samples.id IN (:ids);
1313

1414
-- name: sql-top-samples
1515
SELECT samples.id, samples.name, samples.views, samples.likes, samples.create_date, samples.url, samples.version, samples.version_id,
1616
samples.tags, samples.description, samples.short_description, samples.preview, samples.latest,
17-
versions.`name` as version_name, repos.name as repo_name,
17+
versions.name as version_name, repos.name as repo_name,
1818
users.username, users.fullname
1919
FROM samples
2020
LEFT JOIN versions ON samples.version_id = versions.id
@@ -23,28 +23,28 @@ SELECT samples.id, samples.name, samples.views, samples.likes, samples.create_da
2323
JOIN (SELECT samples.id FROM samples
2424
LEFT JOIN templates ON samples.id = templates.sample_id
2525
WHERE templates.sample_id IS NULL AND samples.latest
26-
ORDER BY likes DESC, views DESC, samples.name ASC LIMIT :offset, :count) as optimize_samples
26+
ORDER BY likes DESC, views DESC, samples.name ASC LIMIT :count OFFSET :offset) as optimize_samples
2727
ON optimize_samples.id = samples.id ORDER BY likes DESC, views DESC, samples.name ASC;
2828

2929
-- name: sql-samples-by-version
3030
SELECT samples.id, samples.name, samples.views, samples.likes, samples.create_date, samples.url, samples.version, samples.version_id,
3131
samples.tags, samples.description, samples.short_description, samples.preview,
32-
versions.`name` as version_name, repos.name as repo_name,
32+
versions.name as version_name, repos.name as repo_name,
3333
users.username, users.fullname FROM samples
3434
JOIN versions ON samples.version_id = versions.id
3535
JOIN repos ON versions.repo_id = repos.id
3636
JOIN users ON samples.owner_id = users.id
3737
JOIN (SELECT id FROM samples WHERE version_id = :version_id
38-
ORDER BY likes DESC, views DESC, samples.name ASC LIMIT :offset, :count) as optimize_samples
38+
ORDER BY likes DESC, views DESC, samples.name ASC LIMIT :count OFFSET :offset) as optimize_samples
3939
ON optimize_samples.id = samples.id ORDER BY likes DESC, views DESC, samples.name ASC;
4040

4141
-- name: sql-sample-version
4242
SELECT version FROM samples WHERE url = :url ORDER BY version DESC;
4343

4444
-- name: sql-add-sample<!
45-
INSERT INTO samples (`name`, `short_description`, `description`, `tags`, `deleted_tags`, `styles`, `scripts`,
46-
`markup`, `markup_type`, `style`, `style_type`, `code`, `code_type`,
47-
`url`, `version`, `owner_id`) VALUES
45+
INSERT INTO samples (name, short_description, description, tags, deleted_tags, styles, scripts,
46+
markup, markup_type, style, style_type, code, code_type,
47+
url, version, owner_id) VALUES
4848
(:name, :short_description, :description, :tags, :deleted_tags, :styles, :scripts,
4949
:markup, :markup_type, :style, :style_type, :code, :code_type,
5050
:url, :version, :owner_id);
@@ -93,31 +93,31 @@ UPDATE samples SET views = views + 1 WHERE id = :id;
9393
UPDATE samples SET preview = :preview WHERE id IN (:ids);
9494

9595
-- name: sql-update-all-samples-latest!
96-
UPDATE samples SET latest = :latest WHERE version_id in
97-
(select id FROM versions WHERE repo_id in (SELECT id FROM repos WHERE `name` = :repo_name)
98-
AND `name` <> :version_name);
96+
UPDATE samples SET latest = :latest WHERE version_id IN
97+
(SELECT id FROM versions WHERE repo_id in (SELECT id FROM repos WHERE name = :repo_name)
98+
AND name <> :version_name);
9999
-- name: sql-update-version-samples-latest!
100-
UPDATE samples SET latest = :latest WHERE version_id in
101-
(select id FROM versions WHERE repo_id in (SELECT id FROM repos WHERE `name` = :repo_name)
102-
AND `name` = :version_name);
100+
UPDATE samples SET latest = :latest WHERE version_id IN
101+
(SELECT id FROM versions WHERE repo_id in (SELECT id FROM repos WHERE name = :repo_name)
102+
AND name = :version_name);
103103
-- name: sql-update-all-user-samples-latest!
104104
UPDATE samples SET latest = :latest WHERE url = :url AND version <> :version;
105105
-- name: sql-update-version-user-samples-latest!
106106
UPDATE samples SET latest = :latest WHERE url = :url AND version = :version;
107107

108108

109109
-- name: sql-template-by-url
110-
SELECT samples.*, versions.`name` as version_name, repos.name as repo_name FROM samples
110+
SELECT samples.*, versions.name AS version_name, repos.name AS repo_name FROM samples
111111
JOIN templates ON samples.id = templates.sample_id
112112
JOIN versions ON samples.version_id = versions.id
113113
JOIN repos ON versions.repo_id = repos.id
114114
WHERE samples.url = :url;
115115

116116
-- name: sql-user-samples-without-preview
117-
SELECT id, `name` FROM samples WHERE preview = false AND version_id IS NULL;
117+
SELECT id, name FROM samples WHERE preview = false AND version_id IS NULL;
118118

119119
-- name: sql-repo-samples-without-preview
120-
SELECT id, `name` FROM samples WHERE preview = false AND version_id IS NOT NULL;
120+
SELECT id, name FROM samples WHERE preview = false AND version_id IS NOT NULL;
121121

122122
-- name: sql-templates
123123
SELECT * FROM samples JOIN templates ON samples.id = templates.sample_id ORDER BY samples.name;
@@ -133,15 +133,17 @@ DELETE FROM templates;
133133
-- name: sql-samples-by-tag
134134
SELECT samples.id, samples.name, samples.views, samples.likes, samples.create_date, samples.url, samples.version, samples.version_id,
135135
samples.tags, samples.description, samples.short_description, samples.preview, samples.latest,
136-
versions.`name` as version_name, repos.name as repo_name,
136+
versions.name as version_name, repos.name as repo_name,
137137
users.username, users.fullname FROM samples
138138
LEFT JOIN versions ON samples.version_id = versions.id
139139
LEFT JOIN repos ON versions.repo_id = repos.id
140140
JOIN users ON samples.owner_id = users.id
141141
JOIN (SELECT samples.id FROM samples
142142
LEFT JOIN templates ON samples.id = templates.sample_id
143-
WHERE templates.sample_id IS NULL AND JSON_CONTAINS(tags, CONCAT('["', :tag , '"]')) AND samples.latest
144-
ORDER BY likes DESC, views DESC, samples.name ASC LIMIT :offset, :count) as optimize_samples
143+
WHERE templates.sample_id IS NULL
144+
AND tags @> ARRAY[:tag]
145+
AND samples.latest
146+
ORDER BY likes DESC, views DESC, samples.name ASC LIMIT :count OFFSET :offset) as optimize_samples
145147
ON optimize_samples.id = samples.id ORDER BY likes DESC, views DESC, samples.name ASC;
146148

147149

@@ -154,13 +156,13 @@ WHERE version_id = :version_id
154156

155157
-- delete all repo ---
156158
-- name: sql-delete-samples-by-repo-name!
157-
DELETE FROM samples WHERE version_id in (select id FROM versions WHERE repo_id in (SELECT id FROM repos WHERE `name` = :name));
159+
DELETE FROM samples WHERE version_id IN (SELECT id FROM versions WHERE repo_id in (SELECT id FROM repos WHERE name = :name));
158160

159161
-- name: sql-delete-versions-by-repo-name!
160-
DELETE FROM versions WHERE repo_id in (SELECT id FROM repos WHERE `name` = :name);
162+
DELETE FROM versions WHERE repo_id IN (SELECT id FROM repos WHERE name = :name);
161163

162164
-- name: sql-delete-repo-by-name!
163-
DELETE FROM repos WHERE `name` = :name;
165+
DELETE FROM repos WHERE name = :name;
164166

165167
-- name: sql-sitemap-sample-urls
166168
SELECT concat(repos.name, '/', samples.url) AS url,

0 commit comments

Comments
 (0)