Title: [919] trunk/activerecord-jdbc/src/java/jdbc_adapter/JdbcMySQLSpec.java: JRUBY-2205: Fix N^2 allocation of bytelists for mysql quoting (taw)
Revision
919
Author
nicksieger
Date
2008-02-29 16:33:56 -0500 (Fri, 29 Feb 2008)

Log Message

JRUBY-2205: Fix N^2 allocation of bytelists for mysql quoting (taw)

Modified Paths


Diff

Modified: trunk/activerecord-jdbc/src/java/jdbc_adapter/JdbcMySQLSpec.java (918 => 919)


--- trunk/activerecord-jdbc/src/java/jdbc_adapter/JdbcMySQLSpec.java	2008-02-28 01:13:28 UTC (rev 918)
+++ trunk/activerecord-jdbc/src/java/jdbc_adapter/JdbcMySQLSpec.java	2008-02-29 21:33:56 UTC (rev 919)
@@ -49,8 +49,9 @@
     private final static ByteList ESCAPE = new ByteList(new byte[]{'\\','\\'});
 
     public static IRubyObject quote_string(IRubyObject recv, IRubyObject string) {
-        boolean replacementFound = false;
         ByteList bl = ((RubyString) string).getByteList();
+        ByteList blNew = new ByteList();
+        int startOfExtend = bl.begin;
         
         for(int i = bl.begin; i < bl.begin + bl.realSize; i++) {
             ByteList rep = null;
@@ -64,23 +65,18 @@
             case '\\': rep = ESCAPE; break;
             default: continue;
             }
-            
-            // On first replacement allocate a different bytelist so we don't manip original 
-            if(!replacementFound) {
-                i-= bl.begin;
-                bl = new ByteList(bl);
-                replacementFound = true;
-            }
-
-            bl.replace(i, 1, rep);
-            i+=1;
+            if(i > startOfExtend)
+              blNew.append(bl, startOfExtend, i-startOfExtend);
+            blNew.append(rep, 0, 2);
+            startOfExtend = i+1;
         }
-
-        if(!replacementFound) {
-            return string;
+        // Nothing changed, can return original
+        if (startOfExtend == bl.begin) {
+          return string;
         }
+        if (bl.begin + bl.realSize > startOfExtend)
+          blNew.append(bl, startOfExtend, bl.begin + bl.realSize - startOfExtend);
 
-
-        return recv.getRuntime().newStringShared(bl);
+        return recv.getRuntime().newStringShared(blNew);
     }
 }
_______________________________________________
Jruby-extras-devel mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/jruby-extras-devel

Reply via email to