From fda24b24a1ebf712b257770f1af11f079d24e034 Mon Sep 17 00:00:00 2001 From: Matt Oquist Date: Tue, 5 Nov 2013 16:34:12 -0500 Subject: [PATCH 1/2] Add ddl/create-primary-key and ddl/create-foreign-key --- src/main/clojure/clojure/java/jdbc/ddl.clj | 37 ++++++++++++++++++++++ src/main/clojure/clojure/java/jdbc/sql.clj | 4 ++- src/test/clojure/clojure/java/test_ddl.clj | 12 +++++++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/main/clojure/clojure/java/jdbc/ddl.clj b/src/main/clojure/clojure/java/jdbc/ddl.clj index 2c359c2a..aa029f65 100644 --- a/src/main/clojure/clojure/java/jdbc/ddl.clj +++ b/src/main/clojure/clojure/java/jdbc/ddl.clj @@ -81,3 +81,40 @@ not very sophisticated." } [name & {:keys [entities] :or {entities sql/as-is}}] (format "DROP INDEX %s" (sql/as-str entities name))) +(defn create-primary-key + "Given a table name and a vector of column names, return the DDL + string for creating a primary key. + + Example: + (create-primary-key :tablename [:field1 :field2]) + \"ALTER TABLE tablename ADD PRIMARY KEY (field1, field2)\"" + [table-name cols & specs] + (let [entities-spec (drop-while #(not= :entities %) specs) + {:keys [entities] :or {entities sql/as-is}} (take 2 entities-spec) + cols-string (apply str + (interpose ", " + (map (sql/as-str entities) + cols)))] + (format "ALTER TABLE %s ADD PRIMARY KEY (%s)" + (sql/as-str entities table-name) + cols-string))) + +(defn create-foreign-key + "Given a foreign key spec, return the DDL string for creating the + foreign key. + + Examples: + (create-foreign-key :constraint-name :tablename :field1 :reftablename :reffield1) + \"ALTER TABLE tablename ADD CONSTRAINT constraint-name FOREIGN KEY (field1) REFERENCES reftablename (reffield1)\" + + (create-foreign-key :ConstraintName :TableName :field1 :RefTableName :reffield1 :entities sql/lower-case) + \"ALTER TABLE tablename ADD CONSTRAINT constraintname FOREIGN KEY (field1) REFERENCES reftablename (reffield1)\"" + [constraint-name table-name col ref-table-name ref-col & specs] + (let [entities-spec (drop-while #(not= :entities %) specs) + {:keys [entities] :or {entities sql/as-is}} (take 2 entities-spec)] + (format "ALTER TABLE %s ADD CONSTRAINT %s FOREIGN KEY (%s) REFERENCES %s (%s)" + (sql/as-str entities table-name) + (sql/as-str entities constraint-name) + (sql/as-str entities col) + (sql/as-str entities ref-table-name) + (sql/as-str entities ref-col)))) diff --git a/src/main/clojure/clojure/java/jdbc/sql.clj b/src/main/clojure/clojure/java/jdbc/sql.clj index 4cc75f2a..9abaf73a 100644 --- a/src/main/clojure/clojure/java/jdbc/sql.clj +++ b/src/main/clojure/clojure/java/jdbc/sql.clj @@ -87,7 +87,9 @@ and update! high-level operations within clojure.java.jdbc directly." } "insert" "insert!" "select" "join" "where" "order-by" "update" "update!" - "create-table" "drop-table" "create-index" "drop-index"}) + "create-table" "drop-table" + "create-index" "drop-index" + "create-primary-key" "create-foreign-key"}) (def ^{:private true :doc "Symbols that need to be processed for identifiers within their forms."} diff --git a/src/test/clojure/clojure/java/test_ddl.clj b/src/test/clojure/clojure/java/test_ddl.clj index fd3b2e36..ba809b23 100644 --- a/src/test/clojure/clojure/java/test_ddl.clj +++ b/src/test/clojure/clojure/java/test_ddl.clj @@ -74,3 +74,15 @@ (is (= "DROP INDEX INDEX") (sql/entities str/upper-case (ddl/drop-index :index)))) + +(deftest test-create-primary-key + (is (= "ALTER TABLE tablename ADD PRIMARY KEY (field1, field2)") + (ddl/create-primary-key :tablename [:field1 :field2])) + (is (= "ALTER TABLE \"table-name\" ADD PRIMARY KEY (\"field-1\", \"field-2\")") + (ddl/create-primary-key :table-name [:field-1 :field-2] :entities (sql/quoted "\"")))) + +(deftest test-create-foreign-key + (is (= "ALTER TABLE tablename ADD CONSTRAINT constraintname FOREIGN KEY (field1) REFERENCES reftablename (reffield1)") + (ddl/create-foreign-key :constraintname :tablename :field1 :reftablename :reffield1)) + (is (= "ALTER TABLE tablename ADD CONSTRAINT constraintname FOREIGN KEY (field1) REFERENCES reftablename (reffield1)") + (ddl/create-foreign-key :ConstraintName :TableName :field1 :RefTableName :reffield1 :entities sql/lower-case))) From 0ccb6780433ac5e2b2a42751ace7d7d6eecd3720 Mon Sep 17 00:00:00 2001 From: Matt Oquist Date: Wed, 6 Nov 2013 14:15:49 -0500 Subject: [PATCH 2/2] bump version for internal use until upstream patch is accepted --- pom.xml | 162 +++++++++++++++++++++++++++++++++++++--------------- project.clj | 2 +- 2 files changed, 118 insertions(+), 46 deletions(-) diff --git a/pom.xml b/pom.xml index 734e6734..253cebd8 100644 --- a/pom.xml +++ b/pom.xml @@ -1,75 +1,147 @@ + 4.0.0 - java.jdbc - 0.3.0-SNAPSHOT - ${project.artifactId} - - org.clojure pom.contrib + org.clojure 0.1.2 + - - - - Stephen C. Gilardi - - - Sean Corfield - - - + org.clojure + java.jdbc + jar + 0.3.0-SNAPSHOT + java.jdbc + A low-level Clojure wrapper for JDBC-based access to databases. + https://github.com/clojure/java.jdbc + + + Eclipse Public License + http://www.eclipse.org/legal/epl-v10.html + + - scm:git:git@github.com:clojure/java.jdbc.git - scm:git:git@github.com:clojure/java.jdbc.git - git@github.com:clojure/java.jdbc.git - HEAD + scm:git:git://github.com/moquist/java.jdbc.git + scm:git:ssh://git@github.com/moquist/java.jdbc.git + fda24b24a1ebf712b257770f1af11f079d24e034 + + https://github.com/moquist/java.jdbc + + src/main/clojure + src/test/clojure + + + resources + + + + + dev-resources + + + resources + + + target + target/classes + + + + central + http://repo1.maven.org/maven2/ + + false + + + true + + + + clojars + https://clojars.org/repo/ + + true + + + true + + + + sonatype-oss-public + https://oss.sonatype.org/content/groups/public/ + + true + + + true + + + - - mysql - mysql-connector-java - 5.1.25 - test - - - org.apache.derby - derby - 10.8.1.2 - test - - - hsqldb - hsqldb - 1.8.0.10 - test - + + org.clojure + clojure + 1.6.0-master-SNAPSHOT + + + mysql + mysql-connector-java + 5.1.25 + + + org.apache.derby + derby + 10.8.1.2 + + + hsqldb + hsqldb + 1.8.0.10 + postgresql postgresql 8.4-702.jdbc4 - test org.xerial sqlite-jdbc 3.7.2 - test net.sourceforge.jtds jtds 1.2.4 + + + org.clojure + tools.nrepl + 0.2.3 + + + org.clojure + clojure + + test - - + + diff --git a/project.clj b/project.clj index be3fc44e..cb98962b 100644 --- a/project.clj +++ b/project.clj @@ -1,4 +1,4 @@ -(defproject org.clojure/java.jdbc "0.3.0-SNAPSHOT" +(defproject org.clojure/java.jdbc "0.3.0-SNAPSHOT4" :description "A low-level Clojure wrapper for JDBC-based access to databases." :parent [org.clojure/pom.contrib "0.1.2"] :url "https://github.com/clojure/java.jdbc"