Patch for 'updateNull' method null pointer exception

Поиск
Список
Период
Сортировка
От Sean Gates
Тема Patch for 'updateNull' method null pointer exception
Дата
Msg-id E6F241DAF915E24F9E34757342EE3E2202007F@ottas09a.ott.signiant.com
обсуждение исходный текст
Список pgsql-jdbc
Greetings,

A few weeks back I posted a question asking about an appropriate
implementation to fix the java.lang.NullPointerException being thrown by
the JDBC updateNull method, but received no response which I assumed
meant "no comment -- decide for yourself". The following patch uses a
somewhat brute force approach to solve the problem by using a "wrapper"
class to enclose values assigned to the updateable resultset value
hashtable so that the assignment of a null pointer value doesn't
generate an exception.

Please apply it to the beta 7.3 stream at your earliest convenience.

Thanks,

Sean Gates
Signiant Corporation
sgates@signiant.com

P.S. Testing has been against PostgreSQL 7.2.1 database only.

------------------------------------------------------------------------
-----------------------

*** AbstractJdbc2ResultSet.java.orig    Thu Sep 19 11:00:52 2002
--- AbstractJdbc2ResultSet.java    Thu Sep 19 14:47:48 2002
***************
*** 623,629 ****
              for ( int i = 1; keys.hasMoreElements(); i++)
              {
                  String key = (String)
keys.nextElement();
!                 insertStatement.setObject(i,
updateValues.get( key ) );
              }

              insertStatement.executeUpdate();
--- 623,629 ----
              for ( int i = 1; keys.hasMoreElements(); i++)
              {
                  String key = (String)
keys.nextElement();
!                 insertStatement.setObject(i,
((ValueWrapper) updateValues.get(key)).value());
              }

              insertStatement.executeUpdate();
***************
*** 634,641 ****

                  long insertedOID =
((AbstractJdbc2Statement) insertStatement).getLastOID();

!                 updateValues.put("oid", new
Long(insertedOID) );
!
              }

              // update the underlying row to the new inserted
data
--- 634,640 ----

                  long insertedOID =
((AbstractJdbc2Statement) insertStatement).getLastOID();

!                 updateValues.put( "oid", new
ValueWrapper(new Long(insertedOID)) );
              }

              // update the underlying row to the new inserted
data
***************
*** 758,765 ****

          doingUpdates = !onInsertRow;

!         updateValues.put( fields[columnIndex - 1].getName(),
theData );
!
      }


--- 757,763 ----

          doingUpdates = !onInsertRow;

!         updateValues.put( fields[columnIndex - 1].getName(), new
ValueWrapper(theData) );
      }


***************
*** 774,781 ****
          }

          doingUpdates = !onInsertRow;
!         updateValues.put( fields[columnIndex - 1].getName(), x
);
!
      }


--- 772,778 ----
          }

          doingUpdates = !onInsertRow;
!         updateValues.put( fields[columnIndex - 1].getName(), new
ValueWrapper(x) );
      }


***************
*** 809,816 ****

          doingUpdates = !onInsertRow;

!         updateValues.put( fields[columnIndex - 1].getName(),
theData );
!
      }


--- 806,812 ----

          doingUpdates = !onInsertRow;

!         updateValues.put( fields[columnIndex - 1].getName(), new
ValueWrapper(theData) );
      }


***************
*** 827,834 ****
              Driver.debug("updating boolean " +
fields[columnIndex - 1].getName() + "=" + x);

          doingUpdates = !onInsertRow;
-         updateValues.put( fields[columnIndex - 1].getName(), new
Boolean(x) );

      }


--- 823,830 ----
              Driver.debug("updating boolean " +
fields[columnIndex - 1].getName() + "=" + x);

          doingUpdates = !onInsertRow;

+         updateValues.put( fields[columnIndex - 1].getName(), new
ValueWrapper(new Boolean(x)) );
      }


***************
*** 841,847 ****
          }

          doingUpdates = true;
!         updateValues.put( fields[columnIndex - 1].getName(),
String.valueOf(x) );
      }


--- 837,844 ----
          }

          doingUpdates = true;
!
!         updateValues.put( fields[columnIndex - 1].getName(), new
ValueWrapper(String.valueOf(x)) );
      }


***************
*** 855,862 ****
          }

          doingUpdates = !onInsertRow;
-         updateValues.put( fields[columnIndex - 1].getName(), x
);

      }


--- 852,859 ----
          }

          doingUpdates = !onInsertRow;

+         updateValues.put( fields[columnIndex - 1].getName(), new
ValueWrapper(x) );
      }


***************
*** 889,896 ****
          }

          doingUpdates = !onInsertRow;
-         updateValues.put( fields[columnIndex - 1].getName(),
theData);

      }


--- 886,893 ----
          }

          doingUpdates = !onInsertRow;

+         updateValues.put( fields[columnIndex - 1].getName(), new
ValueWrapper(theData) );
      }


***************
*** 904,910 ****
          }

          doingUpdates = !onInsertRow;
!         updateValues.put( fields[columnIndex - 1].getName(), x
);
      }


--- 901,908 ----
          }

          doingUpdates = !onInsertRow;
!
!         updateValues.put( fields[columnIndex - 1].getName(), new
ValueWrapper(x) );
      }


***************
*** 920,927 ****
              Driver.debug("updating double " +
fields[columnIndex - 1].getName() + "=" + x);

          doingUpdates = !onInsertRow;
-         updateValues.put( fields[columnIndex - 1].getName(), new
Double(x) );

      }


--- 918,925 ----
              Driver.debug("updating double " +
fields[columnIndex - 1].getName() + "=" + x);

          doingUpdates = !onInsertRow;

+         updateValues.put( fields[columnIndex - 1].getName(), new
ValueWrapper(new Double(x)) );
      }


***************
*** 938,945 ****

          doingUpdates = !onInsertRow;

!         updateValues.put( fields[columnIndex - 1].getName(), new
Float(x) );
!
      }


--- 936,942 ----

          doingUpdates = !onInsertRow;

!         updateValues.put( fields[columnIndex - 1].getName(), new
ValueWrapper(new Float(x)) );
      }


***************
*** 955,962 ****
              Driver.debug("updating int " +
fields[columnIndex - 1].getName() + "=" + x);

          doingUpdates = !onInsertRow;
-         updateValues.put( fields[columnIndex - 1].getName(), new
Integer(x) );

      }


--- 952,959 ----
              Driver.debug("updating int " +
fields[columnIndex - 1].getName() + "=" + x);

          doingUpdates = !onInsertRow;

+         updateValues.put( fields[columnIndex - 1].getName(), new
ValueWrapper(new Integer(x)) );
      }


***************
*** 972,979 ****
              Driver.debug("updating long " +
fields[columnIndex - 1].getName() + "=" + x);

          doingUpdates = !onInsertRow;
-         updateValues.put( fields[columnIndex - 1].getName(), new
Long(x) );

      }


--- 969,976 ----
              Driver.debug("updating long " +
fields[columnIndex - 1].getName() + "=" + x);

          doingUpdates = !onInsertRow;

+         updateValues.put( fields[columnIndex - 1].getName(), new
ValueWrapper(new Long(x)) );
      }


***************
*** 986,994 ****
          }

          doingUpdates = !onInsertRow;
-         updateValues.put( fields[columnIndex - 1].getName(),
null);

!
      }


--- 983,990 ----
          }

          doingUpdates = !onInsertRow;

!         updateValues.put( fields[columnIndex - 1].getName(), new
ValueWrapper(null) );    // ensure value is non-null here
      }


***************
*** 1004,1010 ****
              Driver.debug("updating object " +
fields[columnIndex - 1].getName() + " = " + x);

          doingUpdates = !onInsertRow;
!         updateValues.put( fields[columnIndex - 1].getName(), x
);
      }


--- 1000,1007 ----
              Driver.debug("updating object " +
fields[columnIndex - 1].getName() + " = " + x);

          doingUpdates = !onInsertRow;
!
!         updateValues.put( fields[columnIndex - 1].getName(), new
ValueWrapper(x) );
      }


***************
*** 1152,1158 ****
                  Iterator iterator =
updateValues.values().iterator();
                  for (; iterator.hasNext(); i++)
                  {
!                     updateStatement.setObject( i +
1, iterator.next() );

                  }
                  for ( int j = 0; j < numKeys; j++, i++)
--- 1149,1155 ----
                  Iterator iterator =
updateValues.values().iterator();
                  for (; iterator.hasNext(); i++)
                  {
!                     updateStatement.setObject( i +
1, ((ValueWrapper) iterator.next()).value() );

                  }
                  for ( int j = 0; j < numKeys; j++, i++)
***************
*** 1195,1204 ****
          if ( Driver.logDebug )
              Driver.debug("in update Short " +
fields[columnIndex - 1].getName() + " = " + x);

-
          doingUpdates = !onInsertRow;
-         updateValues.put( fields[columnIndex - 1].getName(), new
Short(x) );

      }


--- 1192,1200 ----
          if ( Driver.logDebug )
              Driver.debug("in update Short " +
fields[columnIndex - 1].getName() + " = " + x);

          doingUpdates = !onInsertRow;

+         updateValues.put( fields[columnIndex - 1].getName(), new
ValueWrapper(new Short(x)) );
      }


***************
*** 1209,1216 ****
              Driver.debug("in update String " +
fields[columnIndex - 1].getName() + " = " + x);

          doingUpdates = !onInsertRow;
-         updateValues.put( fields[columnIndex - 1].getName(), x
);

      }


--- 1205,1212 ----
              Driver.debug("in update String " +
fields[columnIndex - 1].getName() + " = " + x);

          doingUpdates = !onInsertRow;

+         updateValues.put( fields[columnIndex - 1].getName(), new
ValueWrapper(x) );
      }


***************
*** 1220,1229 ****
          if ( Driver.logDebug )
              Driver.debug("in update Time " +
fields[columnIndex - 1].getName() + " = " + x);

-
          doingUpdates = !onInsertRow;
-         updateValues.put( fields[columnIndex - 1].getName(), x
);

      }


--- 1216,1224 ----
          if ( Driver.logDebug )
              Driver.debug("in update Time " +
fields[columnIndex - 1].getName() + " = " + x);

          doingUpdates = !onInsertRow;

+         updateValues.put( fields[columnIndex - 1].getName(), new
ValueWrapper(x) );
      }


***************
*** 1234,1242 ****
              Driver.debug("updating Timestamp " +
fields[columnIndex - 1].getName() + " = " + x);

          doingUpdates = !onInsertRow;
-         updateValues.put( fields[columnIndex - 1].getName(), x
);

!
      }


--- 1229,1236 ----
              Driver.debug("updating Timestamp " +
fields[columnIndex - 1].getName() + " = " + x);

          doingUpdates = !onInsertRow;

!         updateValues.put( fields[columnIndex - 1].getName(), new
ValueWrapper(x) );
      }


***************
*** 1546,1558 ****
                  case Types.REAL:
                  case Types.TINYINT:

!                     rowBuffer[columnIndex] =
connection.getEncoding().encode(String.valueOf( updateValues.get(
columnName ) ));

                  case Types.NULL:
                      continue;

                  default:
!                     rowBuffer[columnIndex] =
(byte[]) updateValues.get( columnName );
              }

          }
--- 1540,1552 ----
                  case Types.REAL:
                  case Types.TINYINT:

!                     rowBuffer[columnIndex] =
connection.getEncoding().encode(String.valueOf( ((ValueWrapper)
updateValues.get(columnName)).value() ));

                  case Types.NULL:
                      continue;

                  default:
!                     rowBuffer[columnIndex] =
(byte[]) ((ValueWrapper) updateValues.get(columnName)).value();
              }

          }
***************
*** 1580,1585 ****
--- 1574,1599 ----
              return getObject(index);
          }
      };
+
+
+     // Purpose:    "Wraps" updateable resultset values to prevent
exceptions caused by null value in 'Hashtable.put()' calls
+     private class ValueWrapper
+     {
+         protected Object value;        // value being enclosed
+
+         ValueWrapper(Object value)
+         {
+             this.value = value;
+         }
+         Object value()
+         {
+             return this.value;
+         }
+         boolean isNull()
+         {
+             return this.value == null;
+         }
+     };




В списке pgsql-jdbc по дате отправления:

Предыдущее
От: Dave Cramer
Дата:
Сообщение: Re: Implementing JDBC3 methods (Was: JDBC and fetching
Следующее
От: Laurentiu Drob
Дата:
Сообщение: Postgres 7.3b1 + pg73b1jdbc3 rs.last() error