Hi Nathan,

Thanks for your review. Actually there are tests for toString() methods in
org.apache.harmony.sql.tests.java.sql. DateTest/TimeTest/Timestamp.
I think these tests are enough, since the functions are not so complex, and
the new implementation passed all tests, so I didn't add new tests for this.
If you found new bugs introduced by the issue, I would like to fix them.

Best Regards,
Regis.

Nathan Beyer wrote:
Are there any associated test cases with this change? On a quick
cursory look, I didn't see any existing tests. Did I miss them? If
not, we need to start requiring some test cases for "simple
improvements" like this to continue functional correctness.

-Nathan

On Tue, Aug 26, 2008 at 3:59 AM,  <[EMAIL PROTECTED]> wrote:
Author: qiuxx
Date: Tue Aug 26 01:59:50 2008
New Revision: 689001

URL: http://svn.apache.org/viewvc?rev=689001&view=rev
Log:
Apply for HARMONY-5958,([classlib][sql][performance] - improve performance of 
java.sql.Date/Time/Timestamp.toString())

Modified:
   harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql/Date.java
   harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql/Time.java
   
harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql/Timestamp.java

Modified: 
harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql/Date.java
URL: 
http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql/Date.java?rev=689001&r1=689000&r2=689001&view=diff
==============================================================================
--- 
harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql/Date.java 
(original)
+++ 
harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql/Date.java 
Tue Aug 26 01:59:50 2008
@@ -17,8 +17,6 @@

 package java.sql;

-import java.text.SimpleDateFormat;
-
 /**
 * A Date class which can consume and produce dates in SQL Date format.
 * <p>
@@ -175,8 +173,28 @@
     */
    @Override
    public String toString() {
-        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
//$NON-NLS-1$
-        return dateFormat.format(this);
+        StringBuilder sb = new StringBuilder(10);
+
+        format((getYear() + 1900), 4, sb);
+        sb.append('-');
+        format((getMonth() + 1), 2, sb);
+        sb.append('-');
+        format(getDate(), 2, sb);
+
+        return sb.toString();
+    }
+
+    private static final String PADDING = "0000";  //$NON-NLS-1$
+
+    /*
+    * Private method to format the time
+    */
+    private void format(int date, int digits, StringBuilder sb) {
+        String str = String.valueOf(date);
+        if (digits - str.length() > 0) {
+            sb.append(PADDING.substring(0, digits - str.length()));
+        }
+        sb.append(str);
    }

    /**

Modified: 
harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql/Time.java
URL: 
http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql/Time.java?rev=689001&r1=689000&r2=689001&view=diff
==============================================================================
--- 
harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql/Time.java 
(original)
+++ 
harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql/Time.java 
Tue Aug 26 01:59:50 2008
@@ -17,7 +17,6 @@

 package java.sql;

-import java.text.SimpleDateFormat;
 import java.util.Date;

 /**
@@ -180,8 +179,28 @@
     */
    @Override
    public String toString() {
-        SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); 
//$NON-NLS-1$
-        return dateFormat.format(this);
+        StringBuilder sb = new StringBuilder(8);
+
+        format(getHours(), 2, sb);
+        sb.append(':');
+        format(getMinutes(), 2, sb);
+        sb.append(':');
+        format(getSeconds(), 2, sb);
+
+        return sb.toString();
+    }
+
+    private static final String PADDING = "00";  //$NON-NLS-1$
+
+    /*
+    * Private method to format the time
+    */
+    private void format(int date, int digits, StringBuilder sb) {
+        String str = String.valueOf(date);
+        if (digits - str.length() > 0) {
+            sb.append(PADDING.substring(0, digits - str.length()));
+        }
+        sb.append(str);
    }

    /**

Modified: 
harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql/Timestamp.java
URL: 
http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql/Timestamp.java?rev=689001&r1=689000&r2=689001&view=diff
==============================================================================
--- 
harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql/Timestamp.java
 (original)
+++ 
harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql/Timestamp.java
 Tue Aug 26 01:59:50 2008
@@ -309,62 +309,43 @@
    @SuppressWarnings("deprecation")
    @Override
    public String toString() {
-        /*
-         * Use a DecimalFormat to lay out the nanosecond value as a simple
-         * string of 9 integers, with leading Zeros
-         */
-        DecimalFormat decimalFormat = new DecimalFormat("0"); //$NON-NLS-1$
-        decimalFormat.setMinimumIntegerDigits(9);
-        decimalFormat.setMaximumIntegerDigits(9);
-        String theNanos = decimalFormat.format(nanos);
-        theNanos = stripTrailingZeros(theNanos);
-
-        String year = format((getYear() + 1900), 4);
-        String month = format((getMonth() + 1), 2);
-        String date = format(getDate(), 2);
-        String hours = format(getHours(), 2);
-        String minutes = format(getMinutes(), 2);
-        String seconds = format(getSeconds(), 2);
-
-        return year + '-' + month + '-' + date + ' ' + hours + ':' + minutes
-                + ':' + seconds + '.' + theNanos;
-    }
+        StringBuilder sb = new StringBuilder(29);

-    /*
-     * Private method to format the time
-     */
-    private String format(int date, int digits) {
-        StringBuilder dateStringBuffer = new 
StringBuilder(String.valueOf(date));
-        while (dateStringBuffer.length() < digits) {
-            dateStringBuffer = dateStringBuffer.insert(0, '0');
+        format((getYear() + 1900), 4, sb);
+        sb.append('-');
+        format((getMonth() + 1), 2, sb);
+        sb.append('-');
+        format(getDate(), 2, sb);
+        sb.append(' ');
+        format(getHours(), 2, sb);
+        sb.append(':');
+        format(getMinutes(), 2, sb);
+        sb.append(':');
+        format(getSeconds(), 2, sb);
+        sb.append('.');
+        if (nanos == 0) {
+            sb.append('0');
+        } else {
+            format(nanos, 9, sb);
+            while (sb.charAt(sb.length() - 1) == '0') {
+                sb.setLength(sb.length() - 1);
+            }
        }
-        return dateStringBuffer.toString();
+
+        return sb.toString();
    }

-    /*
-     * Private method to strip trailing '0' characters from a string. @param
-     * inputString the starting string @return a string with the trailing zeros
-     * stripped - will leave a single 0 at the beginning of the string
-     */
-    private String stripTrailingZeros(String inputString) {
-        String finalString;
+    private static final String PADDING = "000000000";  //$NON-NLS-1$

-        int i;
-        for (i = inputString.length(); i > 0; i--) {
-            if (inputString.charAt(i - 1) != '0') {
-                break;
-            }
-            /*
-             * If the string has a 0 as its first character, return a string
-             * with a single '0'
-             */
-            if (i == 1) {
-                return "0"; //$NON-NLS-1$
-            }
+    /*
+    * Private method to format the time
+    */
+    private void format(int date, int digits, StringBuilder sb) {
+        String str = String.valueOf(date);
+        if (digits - str.length() > 0) {
+            sb.append(PADDING.substring(0, digits - str.length()));
        }
-
-        finalString = inputString.substring(0, i);
-        return finalString;
+        sb.append(str);
    }

    /**




Reply via email to