Title: [PATCH] Fix Issue 247 Oracle DB and add support for DB2

This patch is for branch "branch_2_1_fcs" only.

The attached patch fixes the Oracle DB issue, #247, by changing the data type for message-body and message-attributes from longraw to blob. In order to get this to work I had to change the JDBC code that retrieves these fields to use getBlob instead of getBytes.  I have tested this change with MySql, Oracle  and DB2.

In order to add the Oracle SQL for "retrieveMessageBodySizeSQL" I have used the function dbms_lob.getlength() and I think this requires Oracle 8 or higher. I tested with Oracle 9.

Regards
Steve

<<patch_oracle_db2.txt>>

? patch_oracle_db2.txt
Index: src/conf/sqlResources.xml
===================================================================
RCS file: /home/cvspublic/james-server/src/conf/sqlResources.xml,v
retrieving revision 1.16.4.8
diff -u -r1.16.4.8 sqlResources.xml
--- src/conf/sqlResources.xml   16 Nov 2003 21:47:24 -0000      1.16.4.8
+++ src/conf/sqlResources.xml   5 Apr 2004 16:13:02 -0000
@@ -22,6 +22,7 @@
     <dbMatcher db="postgresql" databaseProductName="postgres.*"/>
     <dbMatcher db="sapdb" databaseProductName="sap.*"/>
     <dbMatcher db="hypersonic" databaseProductName="HypersonicSQL"/>
+    <dbMatcher db="db2" databaseProductName="db2.*"/>
 </dbMatchers>
 
 <!-- SQL statements to use for various components. -->
@@ -195,6 +196,8 @@
     <sql name="retrieveMessageBodySizeSQL" db="mysql">SELECT length(message_body) 
FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
     <sql name="retrieveMessageBodySizeSQL" db="hypersonic">SELECT 
length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
     <sql name="retrieveMessageBodySizeSQL" db="postgresql">SELECT 
length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+    <sql name="retrieveMessageBodySizeSQL" db="oracle">SELECT 
dbms_lob.getlength(message_body) FROM ${table} WHERE message_name = ? AND 
repository_name = ?</sql>
+    <sql name="retrieveMessageBodySizeSQL" db="db2">SELECT length(message_body) FROM 
${table} WHERE message_name = ? AND repository_name = ?</sql>
 
     <!-- Statements used to delete a message stored in this repository. -->
     <sql name="removeMessageSQL">DELETE FROM ${table} WHERE message_name = ? AND 
repository_name = ?</sql>
@@ -261,12 +264,11 @@
         recipients varchar2(1000) NOT NULL ,
         remote_host varchar2(100) NOT NULL ,
         remote_addr varchar2(20) NOT NULL ,
-        message_body long raw NOT NULL ,
-        message_attributes long raw NULL ,
+        message_body blob NOT NULL ,
+        message_attributes blob NULL ,
         last_updated date NOT NULL ,
         PRIMARY KEY (repository_name, message_name)
         )
-        TABLESPACE system
     </sql>
     <sql name="createTable" db="postgresql">
         CREATE TABLE ${table} (
@@ -300,6 +302,22 @@
             PRIMARY KEY (repository_name, message_name)
         )
     </sql>
+    <sql name="createTable" db="db2">
+        CREATE TABLE ${table} (
+        message_name varchar(200) NOT NULL ,
+        repository_name varchar(255) NOT NULL ,
+        message_state varchar(30) NOT NULL ,
+        error_message varchar(200) ,
+        sender varchar(255) ,
+        recipients varchar(1000) NOT NULL ,
+        remote_host varchar(100) NOT NULL ,
+        remote_addr varchar(20) NOT NULL ,
+        message_body blob NOT NULL ,
+        message_attributes blob ,
+        last_updated timestamp NOT NULL ,
+        PRIMARY KEY (repository_name, message_name)
+        )
+    </sql>
 </sqlDefs>
 
 <!-- SQL statements to support the JDBCSpoolRepository class -->
@@ -341,6 +359,8 @@
     <sql name="retrieveMessageBodySizeSQL" db="mysql">SELECT length(message_body) 
FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
     <sql name="retrieveMessageBodySizeSQL" db="hypersonic">SELECT 
length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
     <sql name="retrieveMessageBodySizeSQL" db="postgresql">SELECT 
length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ?</sql>
+    <sql name="retrieveMessageBodySizeSQL" db="oracle">SELECT 
dbms_lob.getlength(message_body) FROM ${table} WHERE message_name = ? AND 
repository_name = ?</sql>
+    <sql name="retrieveMessageBodySizeSQL" db="db2">SELECT length(message_body) FROM 
${table} WHERE message_name = ? AND repository_name = ?</sql>
 
     <!-- Statements used to delete a message stored in this repository. -->
     <sql name="removeMessageSQL">DELETE FROM ${table} WHERE message_name = ? AND 
repository_name = ?</sql>
@@ -407,8 +427,8 @@
         recipients varchar2(1000) NOT NULL ,
         remote_host varchar2(255) NOT NULL ,
         remote_addr varchar2(20) NOT NULL ,
-        message_body long raw NOT NULL ,
-        message_attributes long raw NULL ,
+        message_body blob NOT NULL ,
+        message_attributes blob NULL ,
         last_updated date NOT NULL ,
         PRIMARY KEY (message_name, repository_name)
         )
@@ -443,6 +463,22 @@
             message_attributes long byte NULL ,
             last_updated date NOT NULL,
             PRIMARY KEY (message_name, repository_name)
+        )
+    </sql>
+    <sql name="createTable" db="db2">
+        CREATE TABLE ${table} (
+        message_name varchar(200) NOT NULL ,
+        repository_name varchar(255) NOT NULL ,
+        message_state varchar(30) NOT NULL ,
+        error_message varchar(200) ,
+        sender varchar(255) ,
+        recipients varchar(1000) NOT NULL ,
+        remote_host varchar(100) NOT NULL ,
+        remote_addr varchar(20) NOT NULL ,
+        message_body blob NOT NULL ,
+        message_attributes blob ,
+        last_updated timestamp NOT NULL ,
+        PRIMARY KEY (repository_name, message_name)        
         )
     </sql>
 </sqlDefs>
Index: src/java/org/apache/james/mailrepository/JDBCMailRepository.java
===================================================================
RCS file: 
/home/cvspublic/james-server/src/java/org/apache/james/mailrepository/JDBCMailRepository.java,v
retrieving revision 1.30.4.14
diff -u -r1.30.4.14 JDBCMailRepository.java
--- src/java/org/apache/james/mailrepository/JDBCMailRepository.java    20 Mar 2004 
07:15:12 -0000      1.30.4.14
+++ src/java/org/apache/james/mailrepository/JDBCMailRepository.java    5 Apr 2004 
16:13:02 -0000
@@ -824,7 +824,8 @@
                     
                     if (rsMessageAttr.next()) {
                         try {
-                            byte[] serialized_attr = rsMessageAttr.getBytes(1);
+                            Blob b = rsMessageAttr.getBlob(1);
+                            byte[] serialized_attr = b.getBytes(1, (int)b.length());
                             // this check is for better backwards compatibility
                             if (serialized_attr != null) {
                                 ByteArrayInputStream bais = new 
ByteArrayInputStream(serialized_attr);
Index: src/java/org/apache/james/mailrepository/MimeMessageJDBCSource.java
===================================================================
RCS file: 
/home/cvspublic/james-server/src/java/org/apache/james/mailrepository/MimeMessageJDBCSource.java,v
retrieving revision 1.10.4.4
diff -u -r1.10.4.4 MimeMessageJDBCSource.java
--- src/java/org/apache/james/mailrepository/MimeMessageJDBCSource.java 15 Mar 2004 
03:54:16 -0000      1.10.4.4
+++ src/java/org/apache/james/mailrepository/MimeMessageJDBCSource.java 5 Apr 2004 
16:13:02 -0000
@@ -17,19 +17,19 @@
 
 package org.apache.james.mailrepository;
 
-import org.apache.avalon.cornerstone.services.store.StreamRepository;
-import org.apache.james.core.MimeMessageSource;
-import org.apache.james.util.JDBCUtil;
-
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.SequenceInputStream;
+import java.sql.Blob;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
-import java.sql.Statement;
+
+import org.apache.avalon.cornerstone.services.store.StreamRepository;
+import org.apache.james.core.MimeMessageSource;
+import org.apache.james.util.JDBCUtil;
 
 /**
  * This class points to a specific message in a repository.  This will return an
@@ -137,7 +137,8 @@
                 throw new IOException("Could not find message");
             }
 
-            headers = rsRetrieveMessageStream.getBytes(1);
+            Blob b = rsRetrieveMessageStream.getBlob(1);
+            headers = b.getBytes(1, (int)b.length());
             if (DEEP_DEBUG) {
                 System.err.println("stopping");
                 System.err.println(System.currentTimeMillis() - start);
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to