AbstractJdbc2Connection.java getObject(String type, String value)

Поиск
Список
Период
Сортировка
От Berkes Alexander
Тема AbstractJdbc2Connection.java getObject(String type, String value)
Дата
Msg-id 0E77F407253745429A06B25C5657FBD801887B58@moriz.lfg.oevp.at
обсуждение исходный текст
Ответы Re: AbstractJdbc2Connection.java getObject(String type, String value)  (Kris Jurka <books@ejurka.com>)
Список pgsql-jdbc
Hello,
 
I am getting this Exception when trying to use ResultSet.getObject(int i):
 
--------------------------
java.lang.ClassCastException: java.lang.Class
 at org.postgresql.jdbc2.AbstractJdbc2Connection.getObject(AbstractJdbc2Connection.java:366)
 at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getObject(AbstractJdbc2ResultSet.java:2347)
 at testing.UDTTest.<init>(UDTTest.java:57)
 at testing.UDTTest.main(UDTTest.java:108)
--------------------------
 
 
 
I am using a table (tablename=person) with columns firstname and lastname.
As postgresql always creates a composite type when you create a table, I thought
about just writing a Person class witch implements the SQLData interface.
 
 
 
my Person.class:
 
-------------------------
package testing;
 
import java.io.IOException;
import java.io.StreamTokenizer;
import java.io.StringReader;
import java.sql.SQLData;
import java.sql.SQLException;
import java.sql.SQLInput;
import java.sql.SQLOutput;
 
public class Person implements SQLData {
 private String myType = "testing.Person";
 private String firstname;
 private String lastname;
 
 public static Person parse(String input, String typeName) throws SQLException
    {
       try
       {
          StreamTokenizer tz = new StreamTokenizer(new StringReader(input));
          if(tz.nextToken() == '('
          && tz.nextToken() == StreamTokenizer.TT_WORD)
          {
             String firstname = tz.sval;
             if(tz.nextToken() == ','
             && tz.nextToken() == StreamTokenizer.TT_WORD)
             {
                String lastname = tz.sval;
                if(tz.nextToken() == ')')
                {
                   return new Person(firstname, lastname);
                }
             }
          }
          throw new SQLException("Unable to parse person from string \"" + input + '"');
       }
       catch(IOException e)
       {
          throw new SQLException(e.getMessage());
       }
    }
 
 public Person (String firstname, String lastname){
  this.firstname = firstname;
  this.lastname = lastname;
 }
 
 
 public String getSQLTypeName() throws SQLException {
  return myType;
 }
 
 public void readSQL(SQLInput stream, String typeName) throws SQLException {
  this.myType = typeName;
  firstname = stream.readString();
  lastname = stream.readString();
 }
 
 public void writeSQL(SQLOutput stream) throws SQLException {
  stream.writeString(firstname);
  stream.writeString(lastname);
 }
 
 public String toString(){      
       StringBuffer sb = new StringBuffer();
       sb.append('(');
       sb.append(firstname);
       sb.append(',');
       sb.append(lastname);
       sb.append(')');
      
       return sb.toString();
 }
 
 public String getFirstname(){ return this.firstname; }
 public String getLastname(){ return this.lastname; }
}
---------------------------------------
 
 
In the main class I set the new type in the typemap:
 
--------------------------------
Connection con = .....
.
.
.
.

Map<String, Class<?>> typeMap = con.getTypeMap();
   
if(typeMap == null){
    typeMap = new HashMap<String, Class<?>>();
    System.out.println("Created new typeMap");
}   
   
typeMap.put("person", Class.forName("testing.Person"));
con.setTypeMap(typeMap);
.
.
.
ResultSet rs = con.executeQuery("blah");
 
while(rs.next()){
    Person p = (Person) rs.getObject(1);
}
 
------------------------------
 
 
 
After I played a while I downloaded the postgresql-jdbc source code to look at the class AbstractJdbc2Connection.
I discovered the part where the error accures (look at the bold line):
 
-------------------------
public Object getObject(String type, String value) throws SQLException
    {
        if (typemap != null)
        {
            SQLData d = (SQLData) typemap.get(type);
            if (d != null)
            {
                // Handle the type (requires SQLInput & SQLOutput classes to be implemented)
                if (Driver.logDebug)
                    Driver.debug("getObject(String,String) with custom typemap");
                throw org.postgresql.Driver.notImplemented(this.getClass(), "getObject(String,String)");
            }
        }
.
.
.
.
-------------------------
 
 
 
As we can see the cast to SQLData is wrong, because the typeMap is of form: <String, Class<?>>
Threrefor this line should look like: SQLData d = (SQLData) ((Class)typemap.get(type)).newInstance();
I than recognized, that this feature is not implemented yet in the sourcecode because an Error is thrown
when the Object received is != null.
 
 
 
Could it be possible, that pgjdbc had this implemented correctly in a prior version?
I am not sure about that.....
 
Another question:
I would like to help developing the driver but was not able to integrate the pgjdbc source code into eclipse.
What tools/plugins etc. do I need to handle the Driver.java.in
classe correctly?
 
 
best regards,
 
________________________________
Alexander Berkes
Service & Mobilisierung
EDV und PDV

ÖVP Bundespartei
Lichtenfelsgasse 7, 1010 Wien

Tel.: +43 (1) 40126 512
Fax: +43 (1) 40126 519
mailto:Alexander.Berkes@oevp.at
________________________________
Mach‘ mit und sei dabei:
http://www.perspektiven2010.at
 

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

Предыдущее
От: Eric Faulhaber
Дата:
Сообщение: Re: Batch INSERT failing with error 22P02
Следующее
От: Kris Jurka
Дата:
Сообщение: Re: AbstractJdbc2Connection.java getObject(String type, String value)