You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2009/09/27 15:19:07 UTC
svn commit: r819302 - in /cayenne/main/branches/STABLE-1.2/cayenne:
cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/jdbc/
cayenne-java/src/cayenne/java/org/objectstyle/cayenne/dba/
cayenne-java/src/tests/java/org/objectstyle/cayenne/access...
Author: aadamchik
Date: Sun Sep 27 13:19:07 2009
New Revision: 819302
URL: http://svn.apache.org/viewvc?rev=819302&view=rev
Log:
CAY-1279 Passing null values in query parameters
patch by Evgeny Ryabitskiy
Added:
cayenne/main/branches/STABLE-1.2/cayenne/cayenne-java/src/tests/java/org/objectstyle/cayenne/access/jdbc/BindDirectiveTst.java
Modified:
cayenne/main/branches/STABLE-1.2/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/jdbc/BindDirective.java
cayenne/main/branches/STABLE-1.2/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/dba/TypesMapping.java
cayenne/main/branches/STABLE-1.2/cayenne/cayenne-other/release-notes/RELEASE-NOTES-1.2.5.txt
Modified: cayenne/main/branches/STABLE-1.2/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/jdbc/BindDirective.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-1.2/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/jdbc/BindDirective.java?rev=819302&r1=819301&r2=819302&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-1.2/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/jdbc/BindDirective.java (original)
+++ cayenne/main/branches/STABLE-1.2/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/jdbc/BindDirective.java Sun Sep 27 13:19:07 2009
@@ -128,6 +128,9 @@
}
else if (value != null) {
jdbcType = TypesMapping.getSqlTypeByJava(value.getClass());
+ } else {
+ // value is null, set JDBC type to NULL
+ jdbcType = TypesMapping.getSqlTypeByName(TypesMapping.SQL_NULL);
}
if (jdbcType == TypesMapping.NOT_DEFINED) {
Modified: cayenne/main/branches/STABLE-1.2/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/dba/TypesMapping.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-1.2/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/dba/TypesMapping.java?rev=819302&r1=819301&r2=819302&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-1.2/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/dba/TypesMapping.java (original)
+++ cayenne/main/branches/STABLE-1.2/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/dba/TypesMapping.java Sun Sep 27 13:19:07 2009
@@ -109,6 +109,7 @@
public static final String SQL_VARBINARY = "VARBINARY";
public static final String SQL_VARCHAR = "VARCHAR";
public static final String SQL_OTHER = "OTHER";
+ public static final String SQL_NULL = "NULL";
// char constants for Java data types
public static final String JAVA_LONG = "java.lang.Long";
@@ -171,6 +172,7 @@
sqlStringType.put(SQL_VARBINARY, new Integer(Types.VARBINARY));
sqlStringType.put(SQL_VARCHAR, new Integer(Types.VARCHAR));
sqlStringType.put(SQL_OTHER, new Integer(Types.OTHER));
+ sqlStringType.put(SQL_NULL, new Integer(Types.NULL));
sqlEnumType.put(new Integer(Types.ARRAY), SQL_ARRAY);
sqlEnumType.put(new Integer(Types.BIGINT), SQL_BIGINT);
@@ -196,6 +198,7 @@
sqlEnumType.put(new Integer(Types.VARBINARY), SQL_VARBINARY);
sqlEnumType.put(new Integer(Types.VARCHAR), SQL_VARCHAR);
sqlEnumType.put(new Integer(Types.OTHER), SQL_OTHER);
+ sqlEnumType.put(new Integer(Types.NULL), SQL_NULL);
sqlEnumJava.put(new Integer(Types.BIGINT), JAVA_LONG);
sqlEnumJava.put(new Integer(Types.BINARY), JAVA_BYTES);
Added: cayenne/main/branches/STABLE-1.2/cayenne/cayenne-java/src/tests/java/org/objectstyle/cayenne/access/jdbc/BindDirectiveTst.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-1.2/cayenne/cayenne-java/src/tests/java/org/objectstyle/cayenne/access/jdbc/BindDirectiveTst.java?rev=819302&view=auto
==============================================================================
--- cayenne/main/branches/STABLE-1.2/cayenne/cayenne-java/src/tests/java/org/objectstyle/cayenne/access/jdbc/BindDirectiveTst.java (added)
+++ cayenne/main/branches/STABLE-1.2/cayenne/cayenne-java/src/tests/java/org/objectstyle/cayenne/access/jdbc/BindDirectiveTst.java Sun Sep 27 13:19:07 2009
@@ -0,0 +1,150 @@
+/*****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ****************************************************************/
+package org.objectstyle.cayenne.access.jdbc;
+
+import java.sql.Connection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.objectstyle.art.Artist;
+import org.objectstyle.cayenne.access.MockOperationObserver;
+import org.objectstyle.cayenne.query.SQLTemplate;
+import org.objectstyle.cayenne.query.SelectQuery;
+import org.objectstyle.cayenne.unit.CayenneTestCase;
+
+/**
+ * Tests BindDirective for passed null parameters
+ * and for not passed parameters
+ *
+ * @author Evgeny Ryabitskiy
+ */
+public class BindDirectiveTst extends CayenneTestCase {
+
+ protected void setUp() throws Exception {
+ super.setUp();
+ deleteTestData();
+ }
+
+ public void testBindForPassedNullParam() throws Exception {
+ Map parameters = new HashMap();
+ parameters.put("id", new Integer(1));
+ parameters.put("name", "ArtistWithoutDOB");
+ // passing null in parameter
+ parameters.put("dob", null);
+
+ //without JDBC usage
+ Map row = performInsertForParameters(parameters, false);
+ assertEquals(parameters.get("id"), row.get("ARTIST_ID"));
+ assertEquals(parameters.get("name"), row.get("ARTIST_NAME"));
+ assertEquals(parameters.get("dob"), row.get("DATE_OF_BIRTH"));
+ assertNull(row.get("DATE_OF_BIRTH"));
+ }
+
+ public void testBindWithJDBCForPassedNullParam() throws Exception {
+ Map parameters = new HashMap();
+ parameters.put("id", new Integer(1));
+ parameters.put("name", "ArtistWithoutDOB");
+ // passing null in parameter
+ parameters.put("dob", null);
+
+ //use JDBC
+ Map row = performInsertForParameters(parameters, true);
+ assertEquals(parameters.get("id"), row.get("ARTIST_ID"));
+ assertEquals(parameters.get("name"), row.get("ARTIST_NAME"));
+ assertEquals(parameters.get("dob"), row.get("DATE_OF_BIRTH"));
+ assertNull(row.get("DATE_OF_BIRTH"));
+ }
+
+ public void testBindForNotPassedParam() throws Exception {
+ Map parameters = new HashMap();
+ parameters.put("id", new Integer(1));
+ parameters.put("name", "ArtistWithoutDOB");
+ // not passing parameter parameters.put("dob", not passed!);
+
+ //without JDBC usage
+ Map row = performInsertForParameters(parameters, false);
+ assertEquals(parameters.get("id"), row.get("ARTIST_ID"));
+ assertEquals(parameters.get("name"), row.get("ARTIST_NAME"));
+ //parameter should be passed as null
+ assertNull(row.get("DATE_OF_BIRTH"));
+ }
+
+ public void testBindWithJDBCForNotPassedParam() throws Exception {
+ Map parameters = new HashMap();
+ parameters.put("id", new Integer(1));
+ parameters.put("name", "ArtistWithoutDOB");
+ // not passing parameter parameters.put("dob", not passed!);
+
+ //use JDBC
+ Map row = performInsertForParameters(parameters, true);
+ assertEquals(parameters.get("id"), row.get("ARTIST_ID"));
+ assertEquals(parameters.get("name"), row.get("ARTIST_NAME"));
+ //parameter should be passed as null
+ assertNull(row.get("DATE_OF_BIRTH"));
+ }
+
+
+ /**
+ * Inserts row for given parameters
+ * @return inserted row
+ */
+ private Map performInsertForParameters(Map parameters, boolean useJDBCType) throws Exception {
+ String templateString;
+ if(useJDBCType){
+ templateString = "INSERT INTO ARTIST (ARTIST_ID, ARTIST_NAME, DATE_OF_BIRTH) "
+ + "VALUES (#bind($id), #bind($name), #bind($dob 'DATE'))";
+ } else {
+ templateString = "INSERT INTO ARTIST (ARTIST_ID, ARTIST_NAME, DATE_OF_BIRTH) "
+ + "VALUES (#bind($id), #bind($name), #bind($dob))";
+ }
+ SQLTemplate template = new SQLTemplate(Object.class, templateString);
+
+ template.setParameters(parameters);
+
+ SQLTemplateAction action = new SQLTemplateAction(
+ template,
+ getAccessStackAdapter().getAdapter());
+ assertSame(getAccessStackAdapter().getAdapter(), action.getAdapter());
+
+ Connection c = getConnection();
+ try {
+ MockOperationObserver observer = new MockOperationObserver();
+ action.performAction(c, observer);
+
+ int[] batches = observer.countsForQuery(template);
+ assertNotNull(batches);
+ assertEquals(1, batches.length);
+ assertEquals(1, batches[0]);
+ }
+ finally {
+ c.close();
+ }
+
+ MockOperationObserver observer = new MockOperationObserver();
+ SelectQuery query = new SelectQuery(Artist.class);
+ getDomain().performQueries(Collections.singletonList(query), observer);
+
+ List data = observer.rowsForQuery(query);
+ assertEquals(1, data.size());
+ Map row = (Map) data.get(0);
+ return row;
+ }
+}
Modified: cayenne/main/branches/STABLE-1.2/cayenne/cayenne-other/release-notes/RELEASE-NOTES-1.2.5.txt
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-1.2/cayenne/cayenne-other/release-notes/RELEASE-NOTES-1.2.5.txt?rev=819302&r1=819301&r2=819302&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-1.2/cayenne/cayenne-other/release-notes/RELEASE-NOTES-1.2.5.txt (original)
+++ cayenne/main/branches/STABLE-1.2/cayenne/cayenne-other/release-notes/RELEASE-NOTES-1.2.5.txt Sun Sep 27 13:19:07 2009
@@ -18,3 +18,4 @@
CAY-941 NPE in SimpleNode.connectChildren()
CAY-1052 Invalid cast on NUMERICs with scale of 0 using Postgres JDBC 8.2+
CAY-1259 Wrong Mapping for NUMERIC Type
+CAY-1279 Passing null values in query parameters