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]
