Serge, The class is JamesJDBCMailRepository in method (public void store(MailImpl mc)):
Scan for the start/end markers to find modified code. Remember I just simply copied the contents of the byte array output into a string and written this directly via setString into the message_body field within inbox table in Oracle 8.1.7. S. public void store(MailImpl mc) { //System.err.println("storing " + mc.getName()); Connection conn = null; try { conn = datasource.getConnection(); //Need to determine whether need to insert this record, or update it. //Begin a transaction conn.setAutoCommit(false); PreparedStatement checkMessageExists = conn.prepareStatement(sqlQueries.getSqlString("checkMessageExistsSQL", true)); checkMessageExists.setString(1, mc.getName()); checkMessageExists.setString(2, repositoryName); ResultSet rsExists = checkMessageExists.executeQuery(); boolean exists = rsExists.next() && rsExists.getInt(1) > 0; rsExists.close(); checkMessageExists.close(); if (exists) { //Update the existing record PreparedStatement updateMessage = conn.prepareStatement(sqlQueries.getSqlString("updateMessageSQL", true)); updateMessage.setString(1, mc.getState()); updateMessage.setString(2, mc.getErrorMessage()); if (mc.getSender() == null) { updateMessage.setNull(3, java.sql.Types.VARCHAR); } else { updateMessage.setString(3, mc.getSender().toString()); } StringBuffer recipients = new StringBuffer(); for (Iterator i = mc.getRecipients().iterator(); i.hasNext(); ) { recipients.append(i.next().toString()); if (i.hasNext()) { recipients.append("\r\n"); } } updateMessage.setString(4, recipients.toString()); updateMessage.setString(5, mc.getRemoteHost()); updateMessage.setString(6, mc.getRemoteAddr()); updateMessage.setTimestamp(7, new java.sql.Timestamp(mc.getLastUpdated().getTime())); updateMessage.setString(8, mc.getName()); updateMessage.setString(9, repositoryName); updateMessage.execute(); updateMessage.close(); //Determine whether the message body has changed, and possibly avoid // updating the database. MimeMessage messageBody = mc.getMessage(); boolean saveBody = false; if (messageBody instanceof MimeMessageWrapper) { MimeMessageWrapper message = (MimeMessageWrapper)messageBody; saveBody = message.isModified(); } else { saveBody = true; } if (saveBody) { updateMessage = conn.prepareStatement(sqlQueries.getSqlString("updateMessageBodySQL", true)); ByteArrayOutputStream headerOut = new ByteArrayOutputStream(); OutputStream bodyOut = null; if (sr == null) { //If there is no filestore, use the byte array to store headers // and the body bodyOut = headerOut; } else { //Store the body in the stream repository bodyOut = sr.put(mc.getName()); } //Write the message to the headerOut and bodyOut. bodyOut goes straight to the file MimeMessageWrapper.writeTo(messageBody, headerOut, bodyOut); bodyOut.close(); //Store the headers in the database updateMessage.setBytes(1, headerOut.toByteArray()); updateMessage.setString(2, mc.getName()); updateMessage.setString(3, repositoryName); updateMessage.execute(); updateMessage.close(); } } else { //Insert the record into the database PreparedStatement insertMessage = conn.prepareStatement(sqlQueries.getSqlString("insertMessageSQL", true)); insertMessage.setString(1, mc.getName()); insertMessage.setString(2, repositoryName); insertMessage.setString(3, mc.getState()); insertMessage.setString(4, mc.getErrorMessage()); if (mc.getSender() == null) { insertMessage.setNull(5, java.sql.Types.VARCHAR); } else { insertMessage.setString(5, mc.getSender().toString()); } StringBuffer recipients = new StringBuffer(); for (Iterator i = mc.getRecipients().iterator(); i.hasNext(); ) { recipients.append(i.next().toString()); if (i.hasNext()) { recipients.append("\r\n"); } } insertMessage.setString(6, recipients.toString()); insertMessage.setString(7, mc.getRemoteHost()); insertMessage.setString(8, mc.getRemoteAddr()); insertMessage.setTimestamp(9, new java.sql.Timestamp(mc.getLastUpdated().getTime())); MimeMessage messageBody = mc.getMessage(); ByteArrayOutputStream headerOut = new ByteArrayOutputStream(); OutputStream bodyOut = null; if (sr == null) { //If there is no sr, then use the same byte array to hold the headers // and the body bodyOut = headerOut; } else { //Store the body in the file system. bodyOut = sr.put(mc.getName()); } //Write the message to the headerOut and bodyOut. bodyOut goes straight to the file MimeMessageWrapper.writeTo(messageBody, headerOut, bodyOut); bodyOut.close(); //Store the headers in the database // Sam. Converted byte array output to string as // START // Oracle cannot handle bytes in LONG data type. //insertMessage.setBytes(10, headerOut.toByteArray()); byte[] byteArray = headerOut.toByteArray(); StringBuffer strBuf = new StringBuffer(); for (int i=0; i < byteArray.length;i++) strBuf.append((char)byteArray[i]); insertMessage.setString(10, strBuf.toString()); // END insertMessage.execute(); insertMessage.close(); } conn.commit(); conn.setAutoCommit(true); synchronized (this) { notifyAll(); } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("Exception caught while storing mail Container: " + e); } finally { if (conn != null) { try { conn.close(); } catch (SQLException sqle) { //ignore } } } } >Can you provide code for the Oracle workaround for the LOB? We either have >to do that or apply an Oracle specific patch to call setString instead of >setBytes and with the later I can almost guarantee next month we'll get someone complaining how their Oracle repository is corrupting their >messages by this shortcut. >Serge Knystautas >Loki Technologies - Unstoppable Websites >http://www.lokitech.com/ ----- Original Message ----- From: "Samuel Sadek" <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]> Sent: Sunday, February 24, 2002 7:14 PM Subject: Re: How to make James work with Oracle database? >Apparently if you want to implement a LOB equivalent to hold 8-bit binary >data you'll need to implement an Oracle specific JDBC code to the >JamesJDBCMailRepository class and others which will prove to be mundane and >too drawn down. Also careful considerations will have to be made for other >potential db vendor unexpected behaviour such as mysql, mssql, and others. I >suspect there may be some discrepancies with these as well. The solution >which will prove very tedious but will have to do is to make db specific >JDBC code implementations for all repositories that there exist within >James, and to release as patch fix to users. > >The method I used to get round the problem was to convert the binary output >to string and have this written to an Oracle LONG data type whether it's >7-bits or 8-bits long and has worked via usage of setString method as using >setBytes will not work for Oracle at all as it is not supported by it. > >Sam. > > > >Well, I'm glad it's working, but we'll have to figure out how to >actually > >apply this to the tree. The message 'message_body' needs to be >binary, > >not > >text as messages are allowed to be 8-bit data. I'm sorry I haven't >had > >time > >to jump in sooner, but I believe you'll have more luck if you make > >message_body the LOB equivalent of varbinary, not varchar2. >Accordingly, > >I > >think setBytes is the correct call to make. If we have to, we can add a > >special patch to deal with Oracle bug. > > >I think other people have mentioned the idea of using CMP client code to > >create repositories, but realize you'll get a performance hit by using a > >mapping layer or remote client classes to connect to your EJB server. > > >Serge Knystautas > >Loki Technologies - Unstoppable Websites > >http://www.lokitech.com/ > >----- Original Message ----- >From: "Samuel Sadek" <[EMAIL PROTECTED]> >To: <[EMAIL PROTECTED]> >Sent: Sunday, February 24, 2002 5:25 PM >Subject: RE: How to make James work with Oracle database? > > > >GREAT NEWS! > > > >I HAVE SOLVED THE LONG-AWAITED ISSUE WITH JAMES 2.02A WITH ORACLE 8.1.7. > > > >The problem I found is actually a bug not foreseen by Apache-james dev > >group. This is why using explicit JDBC code is not advisable to handle >pure > >SQL code. > > > >The problem arose in the JamesJDBCMailRepository class when both the >headers > >and message body get written into the message_body table field in the >inbox > >table. Depending which data type you use, in my case I used LONG (max 2GB > >pure chars), you need to cast down to string in the jdbc code and not pass > >in the array as bytes as this type is not supported by Oracle for LONG >data > >type. Instead you need to convert the byte array output (from OutputStream > >object) into String and set the message_body field's parameter to contain > >this converted string value via .setString method and not .setByte method! > > > >That's all there is to it! Obviously all instances of .setByte methods in > >the JamesJDBCMailRepository class would need to be updated when > >accommodating instances of a user modifying a mail's message body. > > > >Sam. > > > >Please find the below the createSql clause in sqlResources.xml I used to > >create the 'inbox' table for Oracle 8.1.7: > > > ><sql name="createTable" db="oracle"> > > CREATE TABLE ${table} ( > > message_name varchar2 (200) NOT NULL, > > repository_name varchar2 (200) NOT NULL, > > message_state varchar2 (30) NOT NULL , > > error_message varchar2 (200) NULL , > > sender varchar2 (200) , > > recipients varchar2 (1000) NOT NULL , > > remote_host varchar2 (100) NOT NULL , > > remote_addr varchar2 (20) NOT NULL , > > message_body long NOT NULL , > > last_updated date NOT NULL , > > PRIMARY KEY (message_name, repository_name) > > ) > > TABLESPACE system > > </sql> > > > >I have one further suggestion. Why not use Entity Container Managed > >Persistence (CMP) type EJB for handling sql statements in the mentioned > >class? It provides useful features such as proper transaction management, > >security, concurrency, etc... It may be worth considering this alternative > >route... > > > >S. > > > > > > >One more thing. Although I'm able to query the Oracle db to extract the > > >headers such as sender, recipients fields from the inbox table via >SQLPlus, > > >I'm not able to receive them neither from my fully compliant POP client > > >software. What is going on????!?!?!? > > > > >S. > > > > >but the message body field should contain readable plain text when you > > >select it. > > > > >-----Original Message----- > > >From: Samuel Sadek [mailto:[EMAIL PROTECTED]] > > >Sent: Saturday, February 23, 2002 11:00 AM > > >To: [EMAIL PROTECTED] > > >Subject: RE: How to make James work with Oracle database? > > > > > > > > >LONG data type caters for instances of field lengths > 4000 with maximum > > >capacity of 2GB of text. It strictly holds text value. Using > > >varchar2 which > > >is equivalent to varchar (MySQL) holds text up to 4000 characters > > >in length > > >which is inadequate. That's the reason of my using LONG. > > > > > >Can anyone please help with this issue? > > > > > >Sam. > > > > > > >long is the wrong datatype ... I dont know what Oracle datatype > > >it >should > > > >be, but MySQL has one called LONGTEXT that I use. > > > >d. > > > > > > > >-----Original Message----- > > > >From: Samuel Sadek [mailto:[EMAIL PROTECTED]] > > > >Sent: Saturday, February 23, 2002 1:05 AM > > > >To: [EMAIL PROTECTED] > > > >Subject: RE: How to make James work with Oracle database? > > > > > > > > > > > >Danny, > > > > > > > >I've followed the suggested instructions below and these are the > > > >output I've > > > >got from my POP server: > > > > > > > > >what does the content of the message_body field contain? it > > > >should >hold a > > > > >complete mail message with all its headers. > > > > > > > >Initially I sqlplus'd into my oracle db and executed the following SQL > > > >statements: > > > > > > > >SQL> select message_state from inbox; > > > > > > > >MESSAGE_STATE > > > >------------------------------ > > > >root > > > >root > > > >root > > > >root > > > >root > > > >root > > > > > > > >6 rows selected. > > > > > > > >SQL> select message_body from inbox; > > > > > > > >MESSAGE_BODY > > > >------------------------------------------------------------------ > > > >-------------- > > > >333533323336333533373334333733353337333233363435333234343335333033 > > > >36333133373334 > > > > > > > >333533323336333533373334333733353337333233363435333234343335333033 > > > >36333133373334 > > > > > > > >333533323336333533373334333733353337333233363435333234343335333033 > > > >36333133373334 > > > > > > > >333533323336333533373334333733353337333233363435333234343335333033 > > > >36333133373334 > > > > > > > >333533323336333533373334333733353337333233363435333234343335333033 > > > >36333133373334 > > > > > > > >333533323336333533373334333733353337333233363435333234343335333033 > > > >36333133373334 > > > > > > > >6 rows selected. > > > > > > > >Could you please explain to me what root in message_state means and if >it > > > >reflects successful mail delivery. > > > > > > > > > > > > >Does the POP server serve the mail correctly? you could try > > > >telnetting >to > > > > >port 110, the commands are > > > > > > > >I've telnetted to my POP server and got the following response back: > > > > > > > >+OK secemail.dnsalias.com POP3 server (JAMES POP3 Server 2.0a2) ready > > > > > > > >which suggests to me that it's up and running. > > > > > > > > >USER [username] > > > > > > > >logged in as a recipient attempting to read the delivered mail > > > >and got the > > > >following response back: > > > > > > > >+OK > > > > > > > > >PASS [password] > > > > > > > >entered valid password for above user and got back: > > > > > > > >+OK Welcome monica > > > > > > > > >LIST > > > > > > > >+OK 6 24000 > > > >1 4000 > > > >2 4000 > > > >3 4000 > > > >4 4000 > > > >5 4000 > > > >6 4000 > > > >. > > > > > > > > >RETR [number of a message from list] > > > > > > > >typed in RETR 3 to yield third message content and got back: > > > > > > > >+OK Message follows > > > >333533323336333533373334333733353337333233363435333234343335333033 > > > >36333133373334 > > > >333633383333343133323330333334333337333333363331333634343337333533 > > > >36333533363433 > > > >333433303337333333363335333633333336333533363434333633313336333933 > > > >36343333323435 > > > >333633343336343533373333333633313336343333363339333633313337333333 > > > >32343533363333 > > > >333634363336343433333435333034343330343133353332333633353336333333 > > > >36333533363339 > > > >333733363336333533363334333334313332333033363336333733323336343633 > > > >36343433323330 > > > >333733323336333833363335333634353336333933373335333634343332343533 > > > >36333233373334 > > > >333633393336343533373334333633353337333233363435333633353337333433 > > > >32343533363333 > > > >333634363336343433323330333233383335343233333331333333393333333433 > > > >32343533333337 > > > >333333333332343533333337333333333332343533333339333333333335343433 > > > >32333933303434 > > > >333034313332333033323330333233303332333033323330333233303332333033 > > > >32333033323330 > > > >333233303336333233373339333233303337333333363335333633333336333533 > > > >36343433363331 > > > >333633393336343333323435333633343336343533373333333633313336343333 > > > >36333933363331 > > > >333733333332343533363333333634363336343433323330333233383334343133 > > > >34333133343434 > > > >333433353335333333323330333533333334343433353334333533303332333033 > > > >35333333363335 > > > >333733323337333633363335333733323332333033333332333234353333333033 > > > >36333133333332 > > > >333233393332333033373337333633393337333433363338333233303335333333 > > > >34343433353334 > > > >333533303332333033343339333433343332333033333332333333383333333433 > > > >30343433303431 > > > >333233303332333033323330333233303332333033323330333233303332333033 > > > >32333033323330 > > > >333633363336343633373332333233303333343333363434333634363336343533 > > > >36333933363333 > > > >333633313334333033373333333633353336333333363335333634343336333133 > > > >36333933363433 > > > >333234353336333433363435333733333336333133363433333633393336333133 > > > >37333333323435 > > > >333633333336343633363434333334353333343233303434333034313332333033 > > > >32333033323330 > > > >333233303332333033323330333233303332333033323330333233303335333333 > > > >36333133373334 > > > >333234333332333033333332333333333332333033343336333633353336333233 > > > >32333033333332 > > > >333333303333333033333332333233303333333033333330333334313333333033 > > > >33333333333431 > > > >333333353333333733323330333234323333333033333330333333303333333033 > > > >30343433303431 > > > >333533323336333533363333333633353336333933373336333633353336333433 > > > >33343133323330 > > > >333633363337333233363436333634343332333033363338333634363337333333 > > > >37333433333332 > > > >333333313333333733323434333333333333333933323434333333343333333033 > > > >32343433333331 > > > >333333323333333433323435333633393336343533323434333633313336333433 > > > >36333433373332 > > > >333234353336333233373334333634363337333033363335333634353337333733 > > > >36343633373332 > > > >333634333336333433323435333633333336343633363434333233303332333833 > > > >35343233333332 > > > >333333313333333733323435333333333333333933323435333333343333333033 > > > >32343533333331 > > > >333333323333333433353434333233303336333833363335333634333336343633 > > > >33343433363436 > > > >333733323336333133363435333633373336333533323339333034343330343133 > > > >30333933363332 > > > >333733393332333033373332333633383336333533363435333633393337333533 > > > >36343433323435 > > > >333633323337333433363339333634353337333433363335333733323336343533 > > > >36333533373334 > > > >333234353336333333363436333634343332333033373337333633393337333433 > > > >36333833323330 > > > >333633353337333333363434333733343337333033323330333233383334333533 > > > >37333833363339 > > > >333634343332333033333333333234353333333233333332333233303332333333 > > > >33333833323339 > > > >333034343330343133303339333633393336333433323330333333313333333633 > > > >36333533353330 > > > >333633353333333733323434333333303333333033333330333333353333333833 > > > >37333033323434 > > > >333333303333333033303434333034313330333933363336333634363337333233 > > > >32333033363434 > > > >333634363336343533363339333633333336333133343330333733333336333533 > > > >36333333363335 > > > >333634343336333133363339333634333332343533363334333634353337333333 > > > >36333133363433 > > > >333633393336333133373333333234353336333333363436333634343333343233 > > > >32333033353333 > > > >333633313337333433323433333233303333333233333333333233303334333633 > > > >36333533363332 > > > >333233303333333233333330333333303333333233323330333333303333333033 > > > >33343133333330 > > > >333333323333343133333333333333353332333033323432333333303333333033 > > > >33333033333330 > > > >. > > > > > > > > >QUIT > > > > > > > >and then quitted pop session from console. > > > > > > > > >d. > > > > > > > >Can you please tell me if any aspect of oracle config is incorrect, the > > > >message's body is actually stored correctly in the db, and if so, > > > >what could > > > >be the cause of my pop3 client not able to receive the message header >and > > > >more importantly, the message body? > > > > > > > >One point I need to make is I'm able to query the message headers > > > >from the > > > >db correctly... > > > > > > > >Would appreciate your feedback. > > > > > > > >Thanks in advance, > > > > > > > >Sam. > > > > > > > > >-----Original Message----- > > > > >From: Samuel Sadek [mailto:[EMAIL PROTECTED]] > > > > >Sent: Friday, February 22, 2002 7:44 PM > > > > >To: [EMAIL PROTECTED] > > > > >Subject: RE: How to make James work with Oracle database? > > > > > > > > > > > > > > >I'm experiencing some major problems with JAMES hooked with > > >Oracle 8.1.7. > > > > >The problem doesn't reside receiving, processing new mail and > > > > >thus storing > > > > >the resulting message in the inbox table in Oracle as I've ran > > >a check on > > > > >the size of the table via "select count(*) from inbox", but > > > > >actually reading > > > > >the new mail off from inbox table using a customised POP mail client > > > > >software using JavaMail. I've used the same client to access > > > > >other POP mail > > > > >with no problems at all, but when I attempt to read from JAMES > > > > >POP server it > > > > >doesn't receive it!!! > > > > > > > > > >Please find below the create SQL clause I've used to create the > > > > >inbox table > > > > >in the first place: > > > > > > > > > ><sql name="createTable" db="oracle"> > > > > > CREATE TABLE ${table} ( > > > > > message_name varchar2 (200) NOT NULL, > > > > > repository_name varchar2 (200) NOT NULL, > > > > > message_state varchar2 (30) NOT NULL , > > > > > error_message varchar2 (200) NULL , > > > > > sender varchar2 (200) , > > > > > recipients varchar2 (1000) NOT NULL , > > > > > remote_host varchar2 (100) NOT NULL , > > > > > remote_addr varchar2 (20) NOT NULL , > > > > > message_body long NOT NULL , > > > > > last_updated date NOT NULL , > > > > > PRIMARY KEY (message_name, repository_name) > > > > > ) > > > > > TABLESPACE system > > > > ></sql> > > > > > > > > > >I'm also aware of Sun's problem with ot reading data off from > > > > >clob so I've > > > > >used a long data type which is standard and should not be the > > > > >cause of the > > > > >problem (althought I'm hoping that's not the case!). > > > > > > > > > >This thread seems to be rather long-winded and pervasive but I would > > > > >appreciate it your comments/feedback on the matter. > > > > > > > > > >Thanks. > > > > > > > > > >Sam. _________________________________________________________________ Chat with friends online, try MSN Messenger: http://messenger.msn.com -- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>