class PG::TypeMapByColumn
This type map casts values by a coder assigned per field/column.
Each PG:TypeMapByColumn has a fixed list of either encoders or decoders, that is defined at new . A type map with encoders is usable for type casting query bind parameters and COPY data for PG::Connection#put_copy_data . A type map with decoders is usable for type casting of result values and COPY data from PG::Connection#get_copy_data .
PG::TypeMapByColumns are in particular useful in conjunction with prepared statements, since they can be cached alongside with the statement handle.
This type map strategy is also used internally by PG::TypeMapByOid, when the number of rows of a result set exceeds a given limit.
Public Class Methods
Builds a new type map and assigns a list of coders for the given column.
coders must be an Array of PG::Coder
objects or nil values. The length of the Array corresponds to
the number of columns or bind parameters this type map is usable for.
A nil value will forward the given field to the
default_type_map .
static VALUE
pg_tmbc_init(VALUE self, VALUE conv_ary)
{
int i;
t_tmbc *this;
int conv_ary_len;
Check_Type(self, T_DATA);
Check_Type(conv_ary, T_ARRAY);
conv_ary_len = RARRAY_LEN(conv_ary);
this = xmalloc(sizeof(t_tmbc) + sizeof(struct pg_tmbc_converter) * conv_ary_len);
/* Set nfields to 0 at first, so that GC mark function doesn't access uninitialized memory. */
this->nfields = 0;
this->typemap.funcs = pg_tmbc_funcs;
this->typemap.default_typemap = pg_typemap_all_strings;
DATA_PTR(self) = this;
for(i=0; i<conv_ary_len; i++)
{
VALUE obj = rb_ary_entry(conv_ary, i);
if( obj == Qnil ){
/* no type cast */
this->convs[i].cconv = NULL;
} else if( rb_obj_is_kind_of(obj, rb_cPG_Coder) ){
Data_Get_Struct(obj, t_pg_coder, this->convs[i].cconv);
} else {
rb_raise(rb_eArgError, "argument %d has invalid type %s (should be nil or some kind of PG::Coder)",
i+1, rb_obj_classname( obj ));
}
}
this->nfields = conv_ary_len;
return self;
}
Public Instance Methods
Array of PG::Coder objects. The length of the Array corresponds to the number of columns or bind parameters this type map is usable for.
static VALUE
pg_tmbc_coders(VALUE self)
{
int i;
t_tmbc *this = DATA_PTR( self );
VALUE ary_coders = rb_ary_new();
for( i=0; i<this->nfields; i++){
t_pg_coder *conv = this->convs[i].cconv;
if( conv ) {
rb_ary_push( ary_coders, conv->coder_obj );
} else {
rb_ary_push( ary_coders, Qnil );
}
}
return rb_obj_freeze(ary_coders);
}
# File lib/pg/type_map_by_column.rb, line 11 def inspect type_strings = coders.map{|c| c ? "#{c.name}:#{c.format}" : 'nil' } "#<#{self.class} #{type_strings.join(' ')}>" end
Returns the type oids of the assigned coders.
# File lib/pg/type_map_by_column.rb, line 7 def oids coders.map{|c| c.oid if c } end