Class: PG::BasicTypeMapBasedOnResult
- Inherits:
-
TypeMapByOid
- Object
- TypeMap
- TypeMapByOid
- PG::BasicTypeMapBasedOnResult
- Includes:
- BasicTypeRegistry
- Defined in:
- lib/pg/basic_type_mapping.rb
Overview
Simple set of rules for type casting common PostgreSQL types from Ruby to PostgreSQL.
OIDs of supported type casts are not hard-coded in the sources, but are retrieved from the PostgreSQL’s pg_type table in PG::BasicTypeMapBasedOnResult.new .
This class works equal to PG::BasicTypeMapForResults, but does not define decoders for the given result OIDs, but encoders. So it can be used to type cast field values based on the type OID retrieved by a separate SQL query.
PG::TypeMapByOid#build_column_map(result) can be used to generate a result independent PG::TypeMapByColumn type map, which can subsequently be used to cast query bind parameters or #put_copy_data fields.
Example:
conn.exec( "CREATE TEMP TABLE copytable (t TEXT, i INT, ai INT[])" )
# Retrieve table OIDs per empty result set.
res = conn.exec( "SELECT * FROM copytable LIMIT 0" )
tm = basic_type_mapping.build_column_map( res )
row_encoder = PG::TextEncoder::CopyRow.new type_map: tm
conn.copy_data( "COPY copytable FROM STDIN", row_encoder ) do |res|
conn.put_copy_data ['a', 123, [5,4,3]]
end
Instance Method Summary collapse
-
#initialize(connection) ⇒ BasicTypeMapBasedOnResult
constructor
A new instance of BasicTypeMapBasedOnResult.
Methods inherited from TypeMapByOid
#add_coder, #build_column_map, #coders, #max_rows_for_online_lookup, #max_rows_for_online_lookup=, #rm_coder
Methods included from TypeMap::DefaultTypeMappable
#default_type_map, #default_type_map=, #with_default_type_map
Constructor Details
#initialize(connection) ⇒ BasicTypeMapBasedOnResult
Returns a new instance of BasicTypeMapBasedOnResult.
302 303 304 305 306 307 308 309 |
# File 'lib/pg/basic_type_mapping.rb', line 302 def initialize(connection) @coder_maps = build_coder_maps(connection) # Populate TypeMapByOid hash with encoders @coder_maps.map{|f| f[:encoder].coders }.flatten.each do |coder| add_coder(coder) end end |