Class: PG::TypeMapByOid
- Includes:
- PG::TypeMap::DefaultTypeMappable
- Defined in:
- ext/pg_type_map_by_oid.c,
ext/pg_type_map_by_oid.c
Overview
This type map casts values based on the type OID of the given column in the result set.
This type map is only suitable to cast values from PG::Result objects. Therefore only decoders might be assigned by the #add_coder method.
Fields with no match to any of the registered type OID / format combination are forwarded to the #default_type_map .
Direct Known Subclasses
Instance Method Summary collapse
-
#add_coder(coder) ⇒ Object
Assigns a new PG::Coder object to the type map.
-
#build_column_map(result) ⇒ Object
This builds a PG::TypeMapByColumn that fits to the given PG::Result object based on it’s type OIDs.
-
#coders ⇒ Array
Array of all assigned PG::Coder objects.
- #max_rows_for_online_lookup ⇒ Integer
-
#max_rows_for_online_lookup=(number) ⇒ Object
Threshold for doing Hash lookups versus creation of a dedicated PG::TypeMapByColumn.
-
#rm_coder(format, oid) ⇒ Object
Removes a PG::Coder object from the type map based on the given oid and format codes.
Methods included from PG::TypeMap::DefaultTypeMappable
#default_type_map, #default_type_map=, #with_default_type_map
Instance Method Details
#add_coder(coder) ⇒ Object
Assigns a new PG::Coder object to the type map. The decoder is registered for type casts based on it’s PG::Coder#oid and PG::Coder#format attributes.
Later changes of the oid or format code within the coder object will have no effect to the type map.
204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 |
# File 'ext/pg_type_map_by_oid.c', line 204
static VALUE
pg_tmbo_add_coder( VALUE self, VALUE coder )
{
VALUE hash;
t_tmbo *this = DATA_PTR( self );
t_pg_coder *p_coder;
struct pg_tmbo_oid_cache_entry *p_ce;
if( !rb_obj_is_kind_of(coder, rb_cPG_Coder) )
rb_raise(rb_eArgError, "invalid type %s (should be some kind of PG::Coder)",
rb_obj_classname( coder ));
Data_Get_Struct(coder, t_pg_coder, p_coder);
if( p_coder->format < 0 || p_coder->format > 1 )
rb_raise(rb_eArgError, "invalid format code %d", p_coder->format);
/* Update cache entry */
p_ce = CACHE_LOOKUP(this, p_coder->format, p_coder->oid);
p_ce->oid = p_coder->oid;
p_ce->p_coder = p_coder;
/* Write coder into the hash of the given format */
hash = this->format[p_coder->format].oid_to_coder;
rb_hash_aset( hash, UINT2NUM(p_coder->oid), coder);
return self;
}
|
#build_column_map(result) ⇒ Object
This builds a PG::TypeMapByColumn that fits to the given PG::Result object based on it’s type OIDs.
315 316 317 318 319 320 321 322 323 324 325 326 |
# File 'ext/pg_type_map_by_oid.c', line 315
static VALUE
pg_tmbo_build_column_map( VALUE self, VALUE result )
{
t_tmbo *this = DATA_PTR( self );
if ( !rb_obj_is_kind_of(result, rb_cPGresult) ) {
rb_raise( rb_eTypeError, "wrong argument type %s (expected kind of PG::Result)",
rb_obj_classname( result ) );
}
return pg_tmbo_build_type_map_for_result2( this, pgresult_get(result) );
}
|
#coders ⇒ Array
Array of all assigned PG::Coder objects.
269 270 271 272 273 274 275 276 277 |
# File 'ext/pg_type_map_by_oid.c', line 269
static VALUE
pg_tmbo_coders( VALUE self )
{
t_tmbo *this = DATA_PTR( self );
return rb_ary_concat(
rb_funcall(this->format[0].oid_to_coder, rb_intern("values"), 0),
rb_funcall(this->format[1].oid_to_coder, rb_intern("values"), 0));
}
|
#max_rows_for_online_lookup ⇒ Integer
300 301 302 303 304 305 |
# File 'ext/pg_type_map_by_oid.c', line 300
static VALUE
pg_tmbo_max_rows_for_online_lookup_get( VALUE self )
{
t_tmbo *this = DATA_PTR( self );
return INT2NUM(this->max_rows_for_online_lookup);
}
|
#max_rows_for_online_lookup=(number) ⇒ Object
Threshold for doing Hash lookups versus creation of a dedicated PG::TypeMapByColumn. The type map will do Hash lookups for each result value, if the number of rows is below or equal number
.
288 289 290 291 292 293 294 |
# File 'ext/pg_type_map_by_oid.c', line 288
static VALUE
pg_tmbo_max_rows_for_online_lookup_set( VALUE self, VALUE value )
{
t_tmbo *this = DATA_PTR( self );
this->max_rows_for_online_lookup = NUM2INT(value);
return value;
}
|
#rm_coder(format, oid) ⇒ Object
Removes a PG::Coder object from the type map based on the given oid and format codes.
Returns the removed coder object.
241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 |
# File 'ext/pg_type_map_by_oid.c', line 241
static VALUE
pg_tmbo_rm_coder( VALUE self, VALUE format, VALUE oid )
{
VALUE hash;
VALUE coder;
t_tmbo *this = DATA_PTR( self );
int i_format = NUM2INT(format);
struct pg_tmbo_oid_cache_entry *p_ce;
if( i_format < 0 || i_format > 1 )
rb_raise(rb_eArgError, "invalid format code %d", i_format);
/* Mark the cache entry as empty */
p_ce = CACHE_LOOKUP(this, i_format, NUM2UINT(oid));
p_ce->oid = 0;
p_ce->p_coder = NULL;
hash = this->format[i_format].oid_to_coder;
coder = rb_hash_delete( hash, oid );
return coder;
}
|