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