[
https://issues.apache.org/jira/browse/DDLUTILS-272?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13136650#comment-13136650
]
Sean Xiong commented on DDLUTILS-272:
-------------------------------------
My Solution:
1) add a block of code to handle Byte[];
2) add a block of code to handle Blob
Affected files:
PlatformImplBase.java of DDLUtils
modifications:
1)protected void setStatementParameterValue(PreparedStatement
statement, int sqlIndex, int typeCode, Object value) throws SQLException;
/**
* the following content is designed to handle Byte[] data type in
PostgreSQL
*/
else if (value instanceof Byte[])
{
Byte[] bytes = (Byte[])value;
byte[] byteArray = new byte[bytes.length];
for(int i = 0; i < bytes.length; i++)
{
byteArray[i] = new Byte(bytes[i]);
}
statement.setBytes(sqlIndex, byteArray);
}
else if (value instanceof Blob)
{
/**
* the following content is designed to handle Blob
data type in PostgreSQL
*/
LargeObjectManager lobj =
((org.postgresql.PGConnection)statement.getConnection()).getLargeObjectAPI();
int oid = lobj.create(LargeObjectManager.READ |
LargeObjectManager.WRITE);
LargeObject obj = lobj.open(oid,
LargeObjectManager.WRITE);
Blob bolbValue = (Blob) value;
if(bolbValue.length() > 0)
obj.write(bolbValue.getBytes(1, (int) ((Blob) value).length()));
else {
String errorMessage = "The large object(Blob
type data) can not be empty : CoreDB team remind you please check the value of
Blob type columns";
throw new Error(errorMessage);
}
obj.close();
byte [] intByte = new byte [4];
for (int i = 0; i < 4; i++)
{
intByte[i] = (byte)(oid >> (8 * i));
}
statement.setBytes(sqlIndex, intByte);
}
> Can not handle the type of Byte[] and Blob when using PostgreSQL
> ----------------------------------------------------------------
>
> Key: DDLUTILS-272
> URL: https://issues.apache.org/jira/browse/DDLUTILS-272
> Project: DdlUtils
> Issue Type: Bug
> Components: Core (No specific database)
> Affects Versions: 1.0
> Reporter: Sean Xiong
> Assignee: Thomas Dudziak
> Labels: Blob, Byte[], postgresql
>
> DDLUTILS Can not handle the type of Byte[] and Blob when using PostgreSQL.
> Exception message with my code:
> org.apache.ddlutils.DatabaseOperationException: Error while inserting into
> the database: Large Objects may not be used in auto-commit mode.
> at
> org.apache.ddlutils.platform.PlatformImplBase.insert(PlatformImplBase.java:1305)
> at coredb.database.DatabaseConnection.create(DatabaseConnection.java:295)
> at
> coredb.controller.EntityControllerBase.createEntity(EntityControllerBase.java:105)
> at entities.core.gen.EntityBaseGen.Save(EntityBaseGen.java:131)
> at test.PresentationTests.populatePresentations(PresentationTests.java:222)
> at test.PresentationTests.setUp(PresentationTests.java:253)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:597)
> at
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
> at
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
> at
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
> at
> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
> at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
> at junit.framework.JUnit4TestAdapter.run(JUnit4TestAdapter.java:39)
> at junit.framework.TestSuite.runTest(TestSuite.java:232)
> at junit.framework.TestSuite.run(TestSuite.java:227)
> at junit.textui.TestRunner.doRun(TestRunner.java:116)
> at junit.textui.TestRunner.doRun(TestRunner.java:109)
> at junit.textui.TestRunner.run(TestRunner.java:77)
> at CoreDBTest.main(CoreDBTest.java:44)
> Caused by: org.postgresql.util.PSQLException: Large Objects may not be used
> in auto-commit mode.
> at
> org.postgresql.largeobject.LargeObjectManager.createLO(LargeObjectManager.java:241)
> at
> org.postgresql.largeobject.LargeObjectManager.createLO(LargeObjectManager.java:228)
> at
> org.postgresql.jdbc2.AbstractJdbc2Statement.setBlob(AbstractJdbc2Statement.java:2851)
> at
> org.postgresql.jdbc2.AbstractJdbc2Statement.setObject(AbstractJdbc2Statement.java:1762)
> at
> org.postgresql.jdbc3g.AbstractJdbc3gStatement.setObject(AbstractJdbc3gStatement.java:37)
> at
> org.postgresql.jdbc4.AbstractJdbc4Statement.setObject(AbstractJdbc4Statement.java:46)
> at
> org.postgresql.jdbc2.AbstractJdbc2Statement.setObject(AbstractJdbc2Statement.java:1691)
> at
> org.postgresql.jdbc3.AbstractJdbc3Statement.setObject(AbstractJdbc3Statement.java:1483)
> at
> org.postgresql.jdbc3g.AbstractJdbc3gStatement.setObject(AbstractJdbc3gStatement.java:47)
> at
> org.postgresql.jdbc4.AbstractJdbc4Statement.setObject(AbstractJdbc4Statement.java:69)
> at
> org.postgresql.jdbc2.AbstractJdbc2Statement.setObject(AbstractJdbc2Statement.java:1724)
> at
> org.apache.ddlutils.platform.PlatformImplBase.setStatementParameterValue(PlatformImplBase.java:2067)
> at
> org.apache.ddlutils.platform.PlatformImplBase.setObject(PlatformImplBase.java:2004)
> at
> org.apache.ddlutils.platform.postgresql.PostgreSqlPlatform.setObject(PostgreSqlPlatform.java:240)
> at
> org.apache.ddlutils.platform.PlatformImplBase.insert(PlatformImplBase.java:1289)
> ... 21 more
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira