Class: PG::TypeMapByOid

Inherits:
TypeMap show all
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 .

Instance Method Summary collapse

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) );
}

#codersArray

Array of all assigned PG::Coder objects.

Returns:

  • (Array)

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_lookupInteger

Returns:

  • (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;
}