From: | vasylenko(at)uksatse(dot)org(dot)ua |
---|---|
To: | pgsql-jdbc(at)postgresql(dot)org |
Subject: | Re: |
Date: | 2007-01-12 08:59:51 |
Message-ID: | OF4EAC71F4.06A72770-ONC2257261.0030D4E4-C2257261.00316CC6@UKCC.UKSATSE |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-jdbc |
Ok, Dave
your question:
>Can you explain this more, or send a small test case. There should be
>no reason to get a primary key simply to move to insert row.
>We do need the primary key in the dataset, but other than that we
>shouldn't fail on move to insert row ?
I have just trased into moveToInsertRow() method step by step.
Firstly, it try to find oid field in result set
Than it looking for Primary Key in result.
That's all what I have done.
there 3 method
moveToInsertRow()
checkUpdateblet()
isUpdateable()
the exception is thrown in the last method.
public synchronized void moveToInsertRow()
throws SQLException
{
checkUpdateable();
if (insertStatement != null)
{
insertStatement = null;
}
// make sure the underlying data is null
clearRowBuffer(false);
onInsertRow = true;
doingUpdates = false;
}
private void checkUpdateable() throws SQLException
{
checkClosed();
if (!isUpdateable())
throw new PSQLException(GT.tr("ResultSet is not updateable.
The query that generated this result set must select only one table, and
must select all primary keys from that table. See the JDBC 2.1 API
Specification, section 5.6 for more details."),
PSQLState.INVALID_CURSOR_STATE);
if (updateValues == null)
{
// allow every column to be updated without a rehash.
updateValues = new HashMap((int)(fields.length / 0.75), 0.75f);
}
}
boolean isUpdateable() throws SQLException
{
checkClosed();
if (resultsetconcurrency == ResultSet.CONCUR_READ_ONLY)
throw new PSQLException(GT.tr("ResultSets with concurrency
CONCUR_READ_ONLY cannot be updated."),
PSQLState.INVALID_CURSOR_STATE);
if (updateable)
return true;
if ( Driver.logDebug )
Driver.debug("checking if rs is updateable");
parseQuery();
if ( singleTable == false )
{
if ( Driver.logDebug )
Driver.debug("not a single table");
return false;
}
if ( Driver.logDebug )
Driver.debug("getting primary keys");
//
// Contains the primary key?
//
primaryKeys = new Vector();
// this is not stricty jdbc spec, but it will make things much
faster if used
// the user has to select oid, * from table and then we will just
use oid
usingOID = false;
int oidIndex = 0;
try
{
oidIndex = findColumn( "oid" );
}
catch (SQLException l_se)
{
//Ignore if column oid isn't selected
}
int i = 0;
// if we find the oid then just use it
//oidIndex will be >0 if the oid was in the select list
if ( oidIndex > 0 )
{
i++;
primaryKeys.add( new PrimaryKey( oidIndex, "oid" ) );
usingOID = true;
}
else
{
// otherwise go and get the primary keys and create a hashtable
of keys
String[] s = quotelessTableName(tableName);
String quotelessTableName = s[0];
String quotelessSchemaName = s[1];
java.sql.ResultSet rs = ((java.sql.Connection)
connection).getMetaData().getPrimaryKeys("", quotelessSchemaName,
quotelessTableName);
for (; rs.next(); i++ )
{
String columnName = rs.getString(4); // get the columnName
int index = findColumn( columnName );
if ( index > 0 )
{
primaryKeys.add( new PrimaryKey(index, columnName ) );
// get the primary key information
}
}
rs.close();
}
if ( Driver.logDebug )
Driver.debug( "no of keys=" + i );
if ( i < 1 )
{
throw new PSQLException(GT.tr("No primary key found for table
{0}.", tableName),
PSQLState.DATA_ERROR);
}
updateable = primaryKeys.size() > 0;
if ( Driver.logDebug )
Driver.debug( "checking primary key " + updateable );
return updateable;
}
From | Date | Subject | |
---|---|---|---|
Next Message | Andres Olarte | 2007-01-12 14:01:12 | Re: |
Previous Message | Deval kulshrestha | 2007-01-12 06:00:09 | Re: Test db connection to 'jdbc:postgresql://grid-master:5432/arco' ... Failed (1) |