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 |