From 22da47b99765111680770e1847b02952593237c8 Mon Sep 17 00:00:00 2001 From: gered Date: Mon, 25 Jan 2016 17:56:42 -0500 Subject: [PATCH] update ragtime and migration db config. add mysql support --- src/leiningen/new/yawt.clj | 24 +++++++++----- src/leiningen/new/yawt/dev/user_webapp.clj | 19 ++++++++++++ .../new/yawt/dev/user_webservice.clj | 19 ++++++++++++ .../new/yawt/env-resources/dev/config.edn | 2 +- .../new/yawt/env-resources/repl/config.edn | 2 +- .../new/yawt/env-resources/uberjar/config.edn | 2 +- src/leiningen/new/yawt/project.clj | 18 +++++------ src/leiningen/new/yawt/src/root_ns/core.clj | 4 +-- .../new/yawt/src/root_ns/db_postgresql.clj | 28 ----------------- src/leiningen/new/yawt/src/root_ns/db_sql.clj | 31 +++++++++++++++++++ 10 files changed, 99 insertions(+), 50 deletions(-) delete mode 100644 src/leiningen/new/yawt/src/root_ns/db_postgresql.clj create mode 100644 src/leiningen/new/yawt/src/root_ns/db_sql.clj diff --git a/src/leiningen/new/yawt.clj b/src/leiningen/new/yawt.clj index 6c1cc85..0b6465e 100644 --- a/src/leiningen/new/yawt.clj +++ b/src/leiningen/new/yawt.clj @@ -10,8 +10,13 @@ #{"webapp" "webservice" "postgresql" + "mysql" "couchdb"}) +(def meta-options + #{"sql" + "nosql"}) + (def default-options #{"webapp"}) @@ -59,10 +64,8 @@ ["dev/user.clj" (render "dev/user_webservice.clj" data)]]) (defn get-sql-files [data] - ["migrations"]) - -(defn get-postgresql-files [data] - [["src/{{path}}/db.clj" (render "src/root_ns/db_postgresql.clj" data)]]) + ["migrations" + ["src/{{path}}/db.clj" (render "src/root_ns/db_sql.clj" data)]]) (defn get-couchdb-files [data] [["src/{{path}}/db.clj" (render "src/root_ns/db_couchdb.clj" data)]]) @@ -75,14 +78,18 @@ (if (:webapp data) (get-webapp-files data)) (if (:webservice data) (get-webservice-files data)) (if (:sql data) (get-sql-files data)) - (if (:postgresql data) (get-postgresql-files data)) (if (:couchdb data) (get-couchdb-files data))))) (defn invalid-options? [options] - (or (seq (clojure.set/difference options supported-options)) + ; TODO: clean this up + (or (seq (clojure.set/difference options (set (concat supported-options meta-options)))) (and (some #{"webapp"} options) (some #{"webservice"} options)) + (and (some #{"mysql"} options) + (some #{"postgresql"} options)) (and (some #{"postgresql"} options) + (some #{"couchdb"} options)) + (and (some #{"mysql"} options) (some #{"couchdb"} options)))) (defn invalid-options-message! [user-options] @@ -90,7 +97,7 @@ (println "Valid options are:" (str/join ", " supported-options)) (println "*** Note that you can only specify at most ONE from each of:") (println " - 'webapp' and 'webservice'") - (println " - 'postgresql' and 'couchdb'") + (println " - 'postgresql', 'mysql' and 'couchdb'") (println "*** If neither 'webapp' or 'webservice' is specified, 'webapp' is assumed") (println "*** Specifying no options will default to use only 'webapp'")) @@ -101,7 +108,8 @@ options)) (defn add-sql-option [options] - (if (some #{"postgresql"} options) + (if (or (some #{"postgresql"} options) + (some #{"mysql"} options)) (conj options "sql") options)) diff --git a/src/leiningen/new/yawt/dev/user_webapp.clj b/src/leiningen/new/yawt/dev/user_webapp.clj index 6dfa931..f61ecad 100644 --- a/src/leiningen/new/yawt/dev/user_webapp.clj +++ b/src/leiningen/new/yawt/dev/user_webapp.clj @@ -2,9 +2,28 @@ (:require weasel.repl.websocket cemerick.piggieback +{{#sql}} + [ragtime.jdbc :as jdbc] + [ragtime.repl :as repl] + [{{root-ns}}.db :as db] +{{/sql}} [edn-config.core :refer [env]]) (:use {{root-ns}}.core)) +{{#sql}} + +(defn get-ragtime-config [] + {:datastore (jdbc/sql-database db/db) + :migrations (jdbc/load-resources "migrations")}) + +(defn migrate [] + (println "Running migrations on" (:subname db/db)) + (repl/migrate (get-ragtime-config))) + +(defn rollback [] + (println "Rolling back migrations on" (:subname db/db)) + (repl/rollback (get-ragtime-config))) +{{/sql}} (defn cljs-repl "after establishing a normal repl with leiningen (e.g. by running 'lein repl') *and* after diff --git a/src/leiningen/new/yawt/dev/user_webservice.clj b/src/leiningen/new/yawt/dev/user_webservice.clj index 905c011..1951574 100644 --- a/src/leiningen/new/yawt/dev/user_webservice.clj +++ b/src/leiningen/new/yawt/dev/user_webservice.clj @@ -1,8 +1,27 @@ (ns user (:require +{{#sql}} + [ragtime.jdbc :as jdbc] + [ragtime.repl :as repl] + [{{root-ns}}.db :as db] +{{/sql}} [edn-config.core :refer [env]]) (:use {{root-ns}}.core)) +{{#sql}} + +(defn get-ragtime-config [] + {:datastore (jdbc/sql-database db/db) + :migrations (jdbc/load-resources "migrations")}) + +(defn migrate [] + (println "Running migrations on" (:subname db/db)) + (repl/migrate (get-ragtime-config))) + +(defn rollback [] + (println "Rolling back migrations on" (:subname db/db)) + (repl/rollback (get-ragtime-config))) +{{/sql}} (if (env :auto-start-server?) (.start (Thread. #(start-server)))) diff --git a/src/leiningen/new/yawt/env-resources/dev/config.edn b/src/leiningen/new/yawt/env-resources/dev/config.edn index ba4a45a..6839ce7 100644 --- a/src/leiningen/new/yawt/env-resources/dev/config.edn +++ b/src/leiningen/new/yawt/env-resources/dev/config.edn @@ -2,7 +2,7 @@ {{#sql}} :db {:host "localhost" :name "db_name" - :port 5432 + :port {{#postgresql}}5432{{/postgresql}}{{#mysql}}3306{{/mysql}} :username "username" :password "password"} {{/sql}} diff --git a/src/leiningen/new/yawt/env-resources/repl/config.edn b/src/leiningen/new/yawt/env-resources/repl/config.edn index 2655707..71e50f3 100644 --- a/src/leiningen/new/yawt/env-resources/repl/config.edn +++ b/src/leiningen/new/yawt/env-resources/repl/config.edn @@ -4,7 +4,7 @@ {{#sql}} :db {:host "localhost" :name "db_name" - :port 5432 + :port {{#postgresql}}5432{{/postgresql}}{{#mysql}}3306{{/mysql}} :username "username" :password "password"} {{/sql}} diff --git a/src/leiningen/new/yawt/env-resources/uberjar/config.edn b/src/leiningen/new/yawt/env-resources/uberjar/config.edn index 0997987..da83be8 100644 --- a/src/leiningen/new/yawt/env-resources/uberjar/config.edn +++ b/src/leiningen/new/yawt/env-resources/uberjar/config.edn @@ -2,7 +2,7 @@ {{#sql}} :db {:host "localhost" :name "db_name" - :port 5432 + :port {{#postgresql}}5432{{/postgresql}}{{#mysql}}3306{{/mysql}} :username "username" :password "password"} {{/sql}} diff --git a/src/leiningen/new/yawt/project.clj b/src/leiningen/new/yawt/project.clj index d1a7ec6..888c40c 100644 --- a/src/leiningen/new/yawt/project.clj +++ b/src/leiningen/new/yawt/project.clj @@ -26,11 +26,15 @@ {{/webservice}} {{#sql}} [org.clojure/java.jdbc "0.4.2"] - [clojurewerkz/ragtime "0.4.0"] + [com.mchange/c3p0 "0.9.5.2"] + [ragtime "0.5.2"] {{/sql}} {{#postgresql}} [org.postgresql/postgresql "9.4-1202-jdbc42"] {{/postgresql}} +{{#mysql}} + [mysql/mysql-connector-java "5.1.36"] +{{/mysql}} {{#couchdb}} [com.ashafa/clutch "0.4.0"] [com.cemerick/url "0.1.1"] @@ -45,9 +49,6 @@ {{#webapp}} [lein-cljsbuild "1.1.2"] {{/webapp}} -{{#sql}} - [clojurewerkz/ragtime.lein "0.4.0"] -{{/sql}} [lein-pprint "1.1.1"]] {{#webapp}} @@ -87,16 +88,15 @@ :stacktraces? false :auto-reload? false}} :dev {:resource-paths ["env-resources/dev"] + :source-paths ["dev"] :dependencies [{{#webapp}}[com.cemerick/piggieback "0.2.1"]{{/webapp}} [pjstadig/humane-test-output "0.7.1"]] -{{#sql}} - :ragtime {:migrations ragtime.sql.files/migrations - :database "jdbc:{{#postgresql}}postgresql{{/postgresql}}://localhost:5432/db_name?user=username&password=password"} -{{/sql}} :injections [(require 'pjstadig.humane-test-output) (pjstadig.humane-test-output/activate!)]} :repl {:resource-paths ["env-resources/repl"] :source-paths ["dev"]}} :aliases {"uberjar" ["do" ["clean"] ["uberjar"]]{{#webapp}} - "cljsdev" ["do" ["cljsbuild" "once"] ["cljsbuild" "auto"]]{{/webapp}}}) \ No newline at end of file + "cljsdev" ["do" ["cljsbuild" "once"] ["cljsbuild" "auto"]]{{/webapp}}{{#sql}} + "migrate" ["run" "-m" "user/migrate"] + "rollback" ["run" "-m" "user/rollback"]{{/sql}}}) \ No newline at end of file diff --git a/src/leiningen/new/yawt/src/root_ns/core.clj b/src/leiningen/new/yawt/src/root_ns/core.clj index 7bf2c90..7ab8690 100644 --- a/src/leiningen/new/yawt/src/root_ns/core.clj +++ b/src/leiningen/new/yawt/src/root_ns/core.clj @@ -40,8 +40,8 @@ {{#sql}} (try - (db/init!) - (info "Database access initialized.") + (db/verify-connection) + (info "Database connection verified.") (catch Exception ex (throw (Exception. "Database not available or bad connection information specified." ex)))) {{/sql}} diff --git a/src/leiningen/new/yawt/src/root_ns/db_postgresql.clj b/src/leiningen/new/yawt/src/root_ns/db_postgresql.clj deleted file mode 100644 index 75a5b48..0000000 --- a/src/leiningen/new/yawt/src/root_ns/db_postgresql.clj +++ /dev/null @@ -1,28 +0,0 @@ -(ns {{root-ns}}.db - (:import - (org.postgresql.ds PGPoolingDataSource)) - (:require - [clojure.java.jdbc :as sql] - [edn-config.core :refer [env]])) - -(defonce db (atom nil)) - -(defn init! - "should be called once when the app starts up. intializes a PGPoolingDataSource - object so the rest of your app can execute database queries." - [] - (reset! - db - (let [db-config (env :db)] - {:datasource - (doto (new PGPoolingDataSource) - (.setServerName (:host db-config)) - (.setDatabaseName (:name db-config)) - (.setPortNumber (:port db-config)) - (.setUser (:username db-config)) - (.setPassword (:password db-config)))})) - ; kind of a cheap way to verify the connection - ; (executes a dummy query that will raise exceptions if the connection info is bad) - (sql/query @db "select 1")) - -;; TODO: add database functions here diff --git a/src/leiningen/new/yawt/src/root_ns/db_sql.clj b/src/leiningen/new/yawt/src/root_ns/db_sql.clj new file mode 100644 index 0000000..f5c2ca9 --- /dev/null +++ b/src/leiningen/new/yawt/src/root_ns/db_sql.clj @@ -0,0 +1,31 @@ +(ns {{root-ns}}.db + (:require + [clojure.java.jdbc :as sql] + [edn-config.core :refer [env]])) + +(def db-config (env :db)) + +{{#postgresql}} +(def db + {:classname "org.postgresql.Driver" + :subprotocol "postgresql" + :subname (str "//" (:host db-config) ":" (or (:port db-config) 5432) "/" (:name db-config)) + :user (:username db-config) + :password (:password db-config)}) +{{/postgresql}} +{{#mysql}} +(def db + {:classname "com.mysql.jdbc.Driver" + :subprotocol "mysql" + :subname (str "//" (:host db-config) ":" (or (:port db-config) 3306) "/" (:name db-config)) + :user (:username db-config) + :password (:password db-config)}) +{{/mysql}} + +(defn verify-connection + "not really required, but can be used at app startup to verify that the database + configuration is correct. will throw an exception if the database is unreachable." + [] + (sql/query db "select 1")) + +;; TODO: add database functions here