You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by vi...@apache.org on 2004/05/19 12:40:03 UTC

cvs commit: james-server/src/java/org/apache/james/util SqlResources.java

vincenzo    2004/05/19 03:40:03

  Modified:    src/conf Tag: branch_2_1_fcs sqlResources.xml
               src/java/org/apache/james/mailrepository Tag: branch_2_1_fcs
                        JDBCMailRepository.java MimeMessageJDBCSource.java
               src/java/org/apache/james/util Tag: branch_2_1_fcs
                        SqlResources.java
  Log:
  1) Fix to a previous fix to JAMES-247. Needed because mssql (and possibly other database products) do not work the way we need with getBlob.
     Created a new sqlResources.xml element ("dbOptions") that allows control of the desired behaviour for each database product, specifically with the new "dbOption"s "getBody" and "getAttributes".
     The defaults set should be fully backwards compatible; only oracle and db2 are set to use getBlob.
  
  2) Added support for "CA-Ingres II 2.6 SQL Configuration using EDBC.JAR", contribution of Jason Tepoorten, and adapted it to 2.2.0 message attributes.
     No testing done.
  
  Revision  Changes    Path
  No                   revision
  No                   revision
  1.16.4.10 +128 -48   james-server/src/conf/sqlResources.xml
  
  Index: sqlResources.xml
  ===================================================================
  RCS file: /home/cvs/james-server/src/conf/sqlResources.xml,v
  retrieving revision 1.16.4.9
  retrieving revision 1.16.4.10
  diff -u -r1.16.4.9 -r1.16.4.10
  --- sqlResources.xml	14 Apr 2004 06:06:59 -0000	1.16.4.9
  +++ sqlResources.xml	19 May 2004 10:40:03 -0000	1.16.4.10
  @@ -23,8 +23,56 @@
       <dbMatcher db="sapdb" databaseProductName="sap.*"/>
       <dbMatcher db="hypersonic" databaseProductName="HypersonicSQL"/>
       <dbMatcher db="db2" databaseProductName="db2.*"/>
  +    <dbMatcher db="ingres" databaseProductName="ingres.*"/>
   </dbMatchers>
   
  +<!--
  +    With the following section it is possible to associate several name/value pairs
  +        of options to a database product, identified by the "db" XML attribute name.
  +    
  +    An element without a "db" attribute, if used for an option name, will become a default value for such option.
  +    Each option may have a "default default", i.e. a default that applies if no element with an empty
  +        "db" attribute (default element) exists as said above;
  +        such default default must be documented for such option below.
  +    
  +    The order of the XML elements is meaningless.
  +    
  +    Here only "getBody" and "getAttributes" option names are set, but others could be used in the future.
  +    Option names:
  +        "getBody" - a string (case insensitive) telling which JDBC ResultSet method will be used to
  +            get the message body field for a database product.
  +            The default default value is "useBytes"..
  +            Values (case insensitive):
  +                "useBytes"  - use getBytes(int).
  +                "useBlob"   - use getBlob(int).
  +        "getAttributes" - a string (case insensitive) telling which JDBC ResultSet method will be used to
  +            get the message attributes field for a database product.
  +           The default default value is "useBytes"..
  +            Values (case insensitive):
  +                "useBytes"  - use getBytes(int).
  +                "useBlob"   - use getBlob(int).
  +-->
  +<dbOptions>
  +    <dbOption name="getBody" value="useBytes"/>
  +    <dbOption name="getAttributes" value="useBytes"/>
  +    <dbOption db="mssql" name="getBody" value="useBytes"/>
  +    <dbOption db="mssql" name="getAttributes" value="useBytes"/>
  +    <dbOption db="oracle" name="getBody" value="useBlob"/>
  +    <dbOption db="oracle" name="getAttributes" value="useBlob"/>
  +    <dbOption db="mysql" name="getBody" value="useBytes"/>
  +    <dbOption db="mysql" name="getAttributes" value="useBytes"/>
  +    <dbOption db="postgresql" name="getBody" value="useBytes"/>
  +    <dbOption db="postgresql" name="getAttributes" value="useBytes"/>
  +    <dbOption db="sapdb" name="getBody" value="useBytes"/>
  +    <dbOption db="sapdb" name="getAttributes" value="useBytes"/>
  +    <dbOption db="hypersonic" name="getBody" value="useBytes"/>
  +    <dbOption db="hypersonic" name="getAttributes" value="useBytes"/>
  +    <dbOption db="db2" name="getBody" value="useBlob"/>
  +    <dbOption db="db2" name="getAttributes" value="useBlob"/>
  +    <dbOption db="ingres" name="getBody" value="useBytes"/>
  +    <dbOption db="ingres" name="getAttributes" value="useBytes"/>
  +</dbOptions>
  +
   <!-- SQL statements to use for various components. -->
   <!-- -->
   <!-- Parameter definitions ${param} are replaced with parameter values -->
  @@ -198,6 +246,7 @@
       <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>
  +    <sql name="retrieveMessageBodySizeSQL" db="ingres">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>
  @@ -256,18 +305,18 @@
       </sql>
       <sql name="createTable" db="oracle">
           CREATE TABLE ${table} (
  -        message_name varchar2(200) NOT NULL ,
  -        repository_name varchar2(255) NOT NULL ,
  -        message_state varchar2(30) NOT NULL ,
  -        error_message varchar2(200) NULL ,
  -        sender varchar2(255) ,
  -        recipients varchar2(1000) NOT NULL ,
  -        remote_host varchar2(100) NOT NULL ,
  -        remote_addr varchar2(20) NOT NULL ,
  -        message_body blob NOT NULL ,
  -        message_attributes blob NULL ,
  -        last_updated date NOT NULL ,
  -        PRIMARY KEY (repository_name, message_name)
  +            message_name varchar2(200) NOT NULL ,
  +            repository_name varchar2(255) NOT NULL ,
  +            message_state varchar2(30) NOT NULL ,
  +            error_message varchar2(200) NULL ,
  +            sender varchar2(255) ,
  +            recipients varchar2(1000) NOT NULL ,
  +            remote_host varchar2(100) NOT NULL ,
  +            remote_addr varchar2(20) NOT NULL ,
  +            message_body blob NOT NULL ,
  +            message_attributes blob NULL ,
  +            last_updated date NOT NULL ,
  +            PRIMARY KEY (repository_name, message_name)
           )
       </sql>
       <sql name="createTable" db="postgresql">
  @@ -304,18 +353,33 @@
       </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)
  +            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>
  +    <sql name="createTable" db="ingres">
  +        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 LONG VARCHAR NOT NULL ,
  +            remote_host varchar (255) NOT NULL ,
  +            remote_addr varchar (20) NOT NULL ,
  +            message_body LONG BYTE NOT NULL ,
  +            message_attributes LONG BYTE ,
  +            last_updated DATE NOT NULL
           )
       </sql>
   </sqlDefs>
  @@ -361,6 +425,7 @@
       <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>
  +    <sql name="retrieveMessageBodySizeSQL" db="ingres">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>
  @@ -419,18 +484,18 @@
       </sql>
       <sql name="createTable" db="oracle">
           CREATE TABLE ${table} (
  -        message_name varchar2(200) NOT NULL ,
  -        repository_name varchar2(255) NOT NULL ,
  -        message_state varchar2(30) NOT NULL ,
  -        error_message varchar2(200) NULL ,
  -        sender varchar2(255) NULL ,
  -        recipients varchar2(1000) NOT NULL ,
  -        remote_host varchar2(255) NOT NULL ,
  -        remote_addr varchar2(20) NOT NULL ,
  -        message_body blob NOT NULL ,
  -        message_attributes blob NULL ,
  -        last_updated date NOT NULL ,
  -        PRIMARY KEY (message_name, repository_name)
  +            message_name varchar2(200) NOT NULL ,
  +            repository_name varchar2(255) NOT NULL ,
  +            message_state varchar2(30) NOT NULL ,
  +            error_message varchar2(200) NULL ,
  +            sender varchar2(255) NULL ,
  +            recipients varchar2(1000) NOT NULL ,
  +            remote_host varchar2(255) NOT NULL ,
  +            remote_addr varchar2(20) NOT NULL ,
  +            message_body blob NOT NULL ,
  +            message_attributes blob NULL ,
  +            last_updated date NOT NULL ,
  +            PRIMARY KEY (message_name, repository_name)
           )
       </sql>
       <sql name="createTable" db="postgresql">
  @@ -467,18 +532,33 @@
       </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)        
  +            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>
  +    <sql name="createTable" db="ingres">
  +        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 LONG VARCHAR NOT NULL ,
  +            remote_host varchar (255) NOT NULL ,
  +            remote_addr varchar (20) NOT NULL ,
  +            message_body LONG BYTE NOT NULL ,
  +            message_attributes LONG BYTE ,
  +            last_updated DATE NOT NULL
           )
       </sql>
   </sqlDefs>
  
  
  
  No                   revision
  No                   revision
  1.30.4.16 +9 -3      james-server/src/java/org/apache/james/mailrepository/JDBCMailRepository.java
  
  Index: JDBCMailRepository.java
  ===================================================================
  RCS file: /home/cvs/james-server/src/java/org/apache/james/mailrepository/JDBCMailRepository.java,v
  retrieving revision 1.30.4.15
  retrieving revision 1.30.4.16
  diff -u -r1.30.4.15 -r1.30.4.16
  --- JDBCMailRepository.java	14 Apr 2004 06:06:59 -0000	1.30.4.15
  +++ JDBCMailRepository.java	19 May 2004 10:40:03 -0000	1.30.4.16
  @@ -824,8 +824,14 @@
                       
                       if (rsMessageAttr.next()) {
                           try {
  -                            Blob b = rsMessageAttr.getBlob(1);
  -                            byte[] serialized_attr = b.getBytes(1, (int)b.length());
  +                            byte[] serialized_attr = null;
  +                            String getAttributesOption = sqlQueries.getDbOption("getAttributes");
  +                            if (getAttributesOption != null && getAttributesOption.equalsIgnoreCase("useBlob")) {
  +                                Blob b = rsMessageAttr.getBlob(1);
  +                                serialized_attr = b.getBytes(1, (int)b.length());
  +                            } else {
  +                                serialized_attr = rsMessageAttr.getBytes(1);
  +                            }
                               // this check is for better backwards compatibility
                               if (serialized_attr != null) {
                                   ByteArrayInputStream bais = new ByteArrayInputStream(serialized_attr);
  
  
  
  1.10.4.6  +7 -2      james-server/src/java/org/apache/james/mailrepository/MimeMessageJDBCSource.java
  
  Index: MimeMessageJDBCSource.java
  ===================================================================
  RCS file: /home/cvs/james-server/src/java/org/apache/james/mailrepository/MimeMessageJDBCSource.java,v
  retrieving revision 1.10.4.5
  retrieving revision 1.10.4.6
  diff -u -r1.10.4.5 -r1.10.4.6
  --- MimeMessageJDBCSource.java	14 Apr 2004 06:06:59 -0000	1.10.4.5
  +++ MimeMessageJDBCSource.java	19 May 2004 10:40:03 -0000	1.10.4.6
  @@ -138,8 +138,13 @@
                   throw new IOException("Could not find message");
               }
   
  -            Blob b = rsRetrieveMessageStream.getBlob(1);
  -            headers = b.getBytes(1, (int)b.length());
  +            String getBodyOption = repository.sqlQueries.getDbOption("getBody");
  +            if (getBodyOption != null && getBodyOption.equalsIgnoreCase("useBlob")) {
  +                Blob b = rsRetrieveMessageStream.getBlob(1);
  +                headers = b.getBytes(1, (int)b.length());
  +            } else {
  +                headers = rsRetrieveMessageStream.getBytes(1);
  +            }
               if (DEEP_DEBUG) {
                   System.err.println("stopping");
                   System.err.println(System.currentTimeMillis() - start);
  
  
  
  No                   revision
  No                   revision
  1.5.4.6   +56 -0     james-server/src/java/org/apache/james/util/SqlResources.java
  
  Index: SqlResources.java
  ===================================================================
  RCS file: /home/cvs/james-server/src/java/org/apache/james/util/SqlResources.java,v
  retrieving revision 1.5.4.5
  retrieving revision 1.5.4.6
  diff -u -r1.5.4.5 -r1.5.4.6
  --- SqlResources.java	15 Mar 2004 03:54:22 -0000	1.5.4.5
  +++ SqlResources.java	19 May 2004 10:40:03 -0000	1.5.4.6
  @@ -47,6 +47,11 @@
       private Map m_sql = new HashMap();
   
       /**
  +     * A map of engine specific options
  +     */
  +    private Map m_dbOptions = new HashMap();
  +
  +    /**
        * A set of all used String values
        */
       static private Map stringTable = java.util.Collections.synchronizedMap(new HashMap());
  @@ -92,6 +97,19 @@
               m_perl5Util = null;     // release the PERL matcher!
           }
   
  +        // Now get the options valid for the database product used.
  +        Element dbOptionsElement = 
  +            (Element)(sqlDoc.getElementsByTagName("dbOptions").item(0));
  +        if ( dbOptionsElement != null ) {
  +            // First populate the map with default values 
  +            populateDbOptions("", dbOptionsElement, m_dbOptions);
  +            // Now update the map with specific product values
  +            if ( dbProduct != null ) {
  +                populateDbOptions(dbProduct, dbOptionsElement, m_dbOptions);
  +            }
  +        }
  +
  +        
           // Now get the section defining sql for the repository required.
           NodeList sections = sqlDoc.getElementsByTagName("sqlDefs");
           int sectionsCount = sections.getLength();
  @@ -242,6 +260,32 @@
       }
   
       /**
  +     * Gets all the name/value pair db option couples related to the dbProduct,
  +     * and put them into the dbOptionsMap.
  +     *
  +     * @param dbProduct the db product used
  +     * @param dbOptionsElement the XML element containing the options
  +     * @param dbOptionsMap the <CODE>Map</CODE> to populate
  +     *
  +     */
  +    private void populateDbOptions(String dbProduct, Element dbOptionsElement, Map dbOptionsMap)
  +    {
  +        NodeList dbOptions = 
  +            dbOptionsElement.getElementsByTagName("dbOption");
  +        for ( int i = 0; i < dbOptions.getLength(); i++ ) {
  +            // Get the values for this option element.
  +            Element dbOption = (Element)dbOptions.item(i);
  +            // Check is this element is pertinent to the dbProduct
  +            // Notice that a missing attribute returns "", good for defaults
  +            if (!dbProduct.equalsIgnoreCase(dbOption.getAttribute("db"))) {
  +                continue;
  +            }
  +            // Put into the map
  +            dbOptionsMap.put(dbOption.getAttribute("name"), dbOption.getAttribute("value"));
  +        }
  +    }
  +
  +    /**
        * Replace substrings of one string with another string and return altered string.
        * @param input input string
        * @param find the string to replace
  @@ -306,4 +350,16 @@
           }
           return sql;
       }
  +    
  +    /**
  +     * Returns the dbOption string value set for the specified dbOption name.
  +     * 
  +     * @param name the name of the dbOption required.
  +     * @return the requested dbOption value
  +     */
  +    public String getDbOption(String name)
  +    {
  +        return (String)m_dbOptions.get(name);
  +    }
  +
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org