| 
      
      
      From: Michael N. <mne...@us...> - 2002-09-26 18:37:31
      
     | 
| Update of /cvsroot/ruby-dbi/src/lib/dbd_mysql
In directory usw-pr-cvs1:/tmp/cvs-serv1565
Modified Files:
	Mysql.rb 
Log Message:
add support for coercing column values (patch by Brad Hilton)
Index: Mysql.rb
===================================================================
RCS file: /cvsroot/ruby-dbi/src/lib/dbd_mysql/Mysql.rb,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- Mysql.rb	3 Jul 2002 16:48:35 -0000	1.15
+++ Mysql.rb	26 Sep 2002 18:37:27 -0000	1.16
@@ -156,6 +156,25 @@
     nil          => [SQL_OTHER, nil, nil]
   }
 
+  TYPE_MAP = {}
+  MysqlField.constants.grep(/^TYPE_/).each do |const|
+    value = MysqlField.const_get(const)
+    case const
+    when 'TYPE_TINY', 'TYPE_INT24', 'TYPE_SHORT', 'TYPE_LONG', 'TYPE_LONGLONG'
+      TYPE_MAP[value] = :as_int
+    when 'TYPE_FLOAT'
+      TYPE_MAP[value] = :as_float
+    when 'TYPE_DATE'
+      TYPE_MAP[value] = :as_date
+    when 'TYPE_TIME'
+      TYPE_MAP[value] = :as_time
+    when 'TYPE_DATETIME'
+      TYPE_MAP[value] = :as_timestamp
+    else
+      TYPE_MAP[value] = :as_str
+    end
+  end
+
   def initialize(handle, attr)
     super
     @mutex = Mutex.new 
@@ -334,6 +353,8 @@
     @mutex.synchronize {
       @handle.query_with_result = true
       @res_handle = @handle.query(sql)
+      @column_info = self.column_info
+      @coerce = DBI::SQL::BasicQuote::Coerce.new
       @current_row = 0
       @rows = @handle.affected_rows
     }
@@ -347,9 +368,20 @@
     raise DBI::DatabaseError.new(err.message)
   end
 
+  def fill_array(rowdata)
+    return nil if rowdata.nil?
+    row = []
+    rowdata.each_with_index { |value, index|
+      type = @column_info[index]['_type']
+      type_symbol = Database::TYPE_MAP[type] || :as_str
+      row[index] = @coerce.coerce(type_symbol, value)
+    }
+    row
+  end
+
   def fetch
     @current_row += 1
-    @res_handle.fetch_row
+    fill_array(@res_handle.fetch_row)
   rescue MyError => err
     raise DBI::DatabaseError.new(err.message)
   end
@@ -358,26 +390,26 @@
       case direction
       when SQL_FETCH_NEXT
         @current_row += 1
-        @res_handle.fetch_row
+        fill_array(@res_handle.fetch_row)
       when SQL_FETCH_PRIOR
         @res_handle.data_seek(@current_row - 1)
-        @res_handle.fetch_row
+        fill_array(@res_handle.fetch_row)
       when SQL_FETCH_FIRST
         @current_row = 1
         @res_handle.data_seek(@current_row - 1)
-        @res_handle.fetch_row
+        fill_array(@res_handle.fetch_row)
       when SQL_FETCH_LAST
         @current_row = @res_handle.num_rows
         @res_handle.data_seek(@current_row - 1)
-        @res_handle.fetch_row
+        fill_array(@res_handle.fetch_row)
       when SQL_FETCH_ABSOLUTE
         @current_row = offset + 1
         @res_handle.data_seek(@current_row - 1)
-        @res_handle.fetch_row
+        fill_array(@res_handle.fetch_row)
       when SQL_FETCH_RELATIVE
         @current_row += offset + 1
         @res_handle.data_seek(@current_row - 1)
-        @res_handle.fetch_row
+        fill_array(@res_handle.fetch_row)
       else
         raise NotSupportedError
       end
 |