[ 
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

        

Reply via email to