Title: [571] trunk/activerecord-jdbc: Fix several Derby problems, including quoting

Diff

Modified: trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_derby.rb (570 => 571)


--- trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_derby.rb	2007-05-10 22:28:32 UTC (rev 570)
+++ trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_derby.rb	2007-05-10 22:39:40 UTC (rev 571)
@@ -17,7 +17,7 @@
                                   "#{name} Load IDs For Limited Eager Loading"
                                   ).collect { |row| connection.quote(row[primary_key], columns_hash[primary_key]) }.join(", ")
           end           
-        end 
+        end
 
         @already_monkeyd = true
       end
@@ -36,13 +36,17 @@
         return nil if value.nil? || value =~ /^\s*null\s*$/i
         case type
         when :string    then value
+        when :text    then value
         when :integer   then defined?(value.to_i) ? value.to_i : (value ? 1 : 0)
         when :primary_key then defined?(value.to_i) ? value.to_i : (value ? 1 : 0) 
+        when :decimal   then self.class.value_to_decimal(value)
         when :float     then value.to_f
         when :datetime  then cast_to_date_or_time(value)
+        when :date      then self.class.string_to_date(value)
         when :timestamp then cast_to_time(value)
         when :binary    then value.scan(/[0-9A-Fa-f]{2}/).collect {|v| v.to_i(16)}.pack("C*")
         when :time      then cast_to_time(value)
+        when :boolean   then self.class.value_to_boolean(value)
         else value
         end
       end
@@ -104,8 +108,8 @@
 
     # Set the sequence to the max value of the table's column.
     def reset_sequence!(table, column, sequence = nil)
-      mpk = select_value("SELECT MAX(#{column}) FROM #{table}")
-      execute("ALTER TABLE #{table} ALTER COLUMN #{column} RESTART WITH #{mpk.to_i + 1}")      
+      mpk = select_value("SELECT MAX(#{quote_column_name column}) FROM #{table}")
+      execute("ALTER TABLE #{table} ALTER COLUMN #{quote_column_name column} RESTART WITH #{mpk.to_i + 1}")      
     end
       
     def reset_pk_sequence!(table, pk = nil, sequence = nil)
@@ -345,6 +349,8 @@
     def quote_column_name(name) #:nodoc:
       if /^references$/i =~ name
         %Q{"#{name.upcase}"}
+      elsif /[A-Z]/ =~ name && /[a-z]/ =~ name
+        %Q{"#{name}"}
       elsif name =~ /\s/
         %Q{"#{name.upcase}"}
       else

Modified: trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_oracle.rb (570 => 571)


--- trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_oracle.rb	2007-05-10 22:28:32 UTC (rev 570)
+++ trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_oracle.rb	2007-05-10 22:39:40 UTC (rev 571)
@@ -10,6 +10,8 @@
         when :float    then value.to_f
         when :datetime then cast_to_date_or_time(value)
         when :time     then cast_to_time(value)
+        when :decimal   then self.class.value_to_decimal(value)
+        when :boolean   then self.class.value_to_boolean(value)
         else value
         end
       end

Modified: trunk/activerecord-jdbc/lib/jdbc_adapter/missing_functionality_helper.rb (570 => 571)


--- trunk/activerecord-jdbc/lib/jdbc_adapter/missing_functionality_helper.rb	2007-05-10 22:28:32 UTC (rev 570)
+++ trunk/activerecord-jdbc/lib/jdbc_adapter/missing_functionality_helper.rb	2007-05-10 22:39:40 UTC (rev 571)
@@ -3,12 +3,12 @@
     #Taken from SQLite adapter
 
     def alter_table(table_name, options = {}) #:nodoc:
-      table_name = table_name.downcase
+      table_name = table_name.to_s.downcase
       altered_table_name = "altered_#{table_name}"
       caller = lambda {|definition| yield definition if block_given?}
 
       transaction do
-        move_table(table_name, altered_table_name)
+        move_table(table_name, altered_table_name, options)
         move_table(altered_table_name, table_name, &caller)
       end
     end
@@ -25,7 +25,7 @@
           (options[:rename][column.name] ||
            options[:rename][column.name.to_sym] ||
            column.name) : column.name
-
+          column_name = column_name.to_s
           @definition.column(column_name, column.type, 
                              :limit => column.limit, :default => column.default,
                              :null => column.null)

Modified: trunk/activerecord-jdbc/src/java/JdbcAdapterInternalService.java (570 => 571)


--- trunk/activerecord-jdbc/src/java/JdbcAdapterInternalService.java	2007-05-10 22:28:32 UTC (rev 570)
+++ trunk/activerecord-jdbc/src/java/JdbcAdapterInternalService.java	2007-05-10 22:39:40 UTC (rev 571)
@@ -226,6 +226,8 @@
         }    
     }
 
+    private static final java.util.regex.Pattern HAS_SMALL = java.util.regex.Pattern.compile("[a-z]");
+    private static final java.util.regex.Pattern HAS_LARGE = java.util.regex.Pattern.compile("[A-Z]");
     private static IRubyObject unmarshal_columns(IRubyObject recv, DatabaseMetaData metadata, ResultSet rs) throws SQLException, IOException {
         List columns = new ArrayList();
         boolean isDerby = metadata.getClass().getName().indexOf("derby") != -1;
@@ -238,7 +240,7 @@
 
         while(rs.next()) {
             String column_name = rs.getString(4);
-            if(metadata.storesUpperCaseIdentifiers()) {
+            if(metadata.storesUpperCaseIdentifiers() && !HAS_SMALL.matcher(column_name).find()) {
                 column_name = column_name.toLowerCase();
             }
 
@@ -305,7 +307,11 @@
         List keyNames = new ArrayList();
         Ruby runtime = recv.getRuntime();
         while(result_set.next()) {
-            keyNames.add(runtime.newString(result_set.getString(4).toLowerCase()));
+            String s1 = result_set.getString(4);
+            if(metadata.storesUpperCaseIdentifiers() && !HAS_SMALL.matcher(s1).find()) {
+                s1 = s1.toLowerCase();
+            }
+            keyNames.add(runtime.newString(s1));
         }
         
         try {
@@ -443,12 +449,11 @@
         int[] col_scale = new int[col_count];
 
         for(int i=0;i<col_count;i++) {
-            if(storesUpper) {
-                col_names[i] = runtime.newString(metadata.getColumnName(i+1).toLowerCase());
-            } else {
-                col_names[i] = runtime.newString(metadata.getColumnName(i+1));
+            String s1 = metadata.getColumnName(i+1);
+            if(storesUpper && !HAS_SMALL.matcher(s1).find()) {
+                s1 = s1.toLowerCase();
             }
-
+            col_names[i] = runtime.newString(s1);
             col_types[i] = metadata.getColumnType(i+1);
             col_scale[i] = metadata.getScale(i+1);
         }
_______________________________________________
Jruby-extras-devel mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/jruby-extras-devel

Reply via email to