Class: PGresult
Overview
******************************************************************
The class to represent the query result tuples (rows).
An instance of this class is created as the result of every query.
You may need to invoke the #clear method of the instance when finished with
the result for better memory performance.
Example:
require 'pg'
conn = PGconn.open(:dbname => 'test')
res = conn.exec('SELECT 1 AS a, 2 AS b, NULL AS c')
res.getvalue(0,0) # '1'
res[0]['b'] # '2'
res[0]['c'] # nil
Constant Summary collapse
- PGRES_EMPTY_QUERY =
The string sent to the server was empty.
#result_status constant
- PGRES_COMMAND_OK =
Successful completion of a command returning no data.
#result_status constant
- PGRES_TUPLES_OK =
Successful completion of a command returning data
(such as a SELECT or SHOW).
#result_status constant
- PGRES_COPY_OUT =
Copy Out (from server) data transfer started.
#result_status constant
- PGRES_COPY_IN =
Copy In (to server) data transfer started.
#result_status constant
- PGRES_BAD_RESPONSE =
The server’s response was not understood.
#result_status constant
- PGRES_NONFATAL_ERROR =
A nonfatal error (a notice or warning) occurred.
#result_status constant
- PGRES_FATAL_ERROR =
A fatal error occurred.
#result_status constant
- PG_DIAG_SEVERITY =
The severity; the field contents are ERROR, FATAL, or PANIC (in an error message), or WARNING, NOTICE, DEBUG, INFO, or LOG (in a notice message), or a localized translation of one of these. Always present.
#result_error_field argument constant
- PG_DIAG_SQLSTATE =
The SQLSTATE code for the error. The SQLSTATE code identies the type of error that has occurred; it can be used by front-end applications to perform specic operations (such as er- ror handling) in response to a particular database error. For a list of the possible SQLSTATE codes, see Appendix A. This eld is not localizable, and is always present.
#result_error_field argument constant
- PG_DIAG_MESSAGE_PRIMARY =
The primary human-readable error message (typically one line). Always present.
#result_error_field argument constant
- PG_DIAG_MESSAGE_DETAIL =
Detail: an optional secondary error message carrying more detail about the problem. Might run to multiple lines.
#result_error_field argument constant
- PG_DIAG_MESSAGE_HINT =
Hint: an optional suggestion what to do about the problem. This is intended to differ from detail in that it offers advice (potentially inappropriate) rather than hard facts. Might run to multiple lines.
#result_error_field argument constant
- PG_DIAG_STATEMENT_POSITION =
A string containing a decimal integer indicating an error cursor position as an index into the original statement string. The rst character has index 1, and positions are measured in characters not bytes.
#result_error_field argument constant
- PG_DIAG_INTERNAL_POSITION =
This is dened the same as the PG_DIAG_STATEMENT_POSITION eld, but it is used when the cursor position refers to an internally generated command rather than the one submitted by the client. The PG_DIAG_INTERNAL_QUERY eld will always appear when this eld appears.
#result_error_field argument constant
- PG_DIAG_INTERNAL_QUERY =
The text of a failed internally-generated command. This could be, for example, a SQL query issued by a PL/pgSQL function.
#result_error_field argument constant
- PG_DIAG_CONTEXT =
An indication of the context in which the error occurred. Presently this includes a call stack traceback of active procedural language functions and internally-generated queries. The trace is one entry per line, most recent rst.
#result_error_field argument constant
- PG_DIAG_SOURCE_FILE =
The le name of the source-code location where the error was reported.
#result_error_field argument constant
- PG_DIAG_SOURCE_LINE =
The line number of the source-code location where the error was reported.
#result_error_field argument constant
- PG_DIAG_SOURCE_FUNCTION =
The name of the source-code function reporting the error.
#result_error_field argument constant
- InvalidOid =
Invalid OID constant
INT2FIX(InvalidOid)
Instance Method Summary collapse
-
#[](n) ⇒ Hash
Returns tuple n as a hash.
-
#clear ⇒ nil
Clears the PGresult object as the result of the query.
-
#cmd_status ⇒ String
Returns the status string of the last query command.
-
#cmd_tuples ⇒ Fixnum
(also: #cmdtuples)
Returns the number of tuples (rows) affected by the SQL command.
-
#column_values(n) ⇒ Array
Returns an Array of the values from the nth column of each tuple in the result.
-
#each {|tuple| ... } ⇒ Object
Invokes block for each tuple in the result set.
-
#fformat(column_number) ⇒ Fixnum
Returns the format (0 for text, 1 for binary) of column column_number.
-
#field_values(field) ⇒ Array
Returns an Array of the values from the given field of each tuple in the result.
-
#fields ⇒ Array
Returns an array of Strings representing the names of the fields in the result.
-
#fmod(column_number) ⇒ Object
Returns the type modifier associated with column column_number.
-
#fname(index) ⇒ String
Returns the name of the column corresponding to index.
-
#fnumber(name) ⇒ Fixnum
Returns the index of the field specified by the string name.
-
#fsize(index) ⇒ Object
Returns the size of the field type in bytes.
-
#ftable(column_number) ⇒ Fixnum
Returns the Oid of the table from which the column column_number was fetched.
-
#ftablecol(column_number) ⇒ Fixnum
Returns the column number (within its table) of the table from which the column column_number is made up.
-
#ftype(column_number) ⇒ Object
Returns the data type associated with column_number.
-
#getisnull(tuple_position, field_position) ⇒ Boolean
Returns
true
if the specified value isnil
;false
otherwise. -
#getlength(tup_num, field_num) ⇒ Fixnum
Returns the (String) length of the field in bytes.
-
#getvalue(tup_num, field_num) ⇒ Object
Returns the value in tuple number tup_num, field field_num, or
nil
if the field isNULL
. -
#nfields ⇒ Fixnum
(also: #num_fields)
Returns the number of columns in the query result.
-
#nparams ⇒ Fixnum
Returns the number of parameters of a prepared statement.
-
#ntuples ⇒ Fixnum
(also: #num_tuples)
Returns the number of tuples in the query result.
-
#oid_value ⇒ Fixnum
Returns the
oid
of the inserted row if applicable, otherwisenil
. -
#paramtype(param_number) ⇒ Oid
Returns the Oid of the data type of parameter param_number.
-
#res_status(status) ⇒ String
Returns the string representation of status
status
. -
#result_error_field(fieldcode) ⇒ String
Returns the individual field of an error.
-
#result_error_message ⇒ String
Returns the error message of the command as a string.
-
#result_status ⇒ Fixnum
Returns the status of the query.
-
#values ⇒ Array
Returns all tuples as an array of arrays.
Instance Method Details
#[](n) ⇒ Hash
Returns tuple n as a hash.
3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 |
# File 'ext/pg.c', line 3478
static VALUE
pgresult_aref(VALUE self, VALUE index)
{
PGresult *result = get_pgresult(self);
int tuple_num = NUM2INT(index);
int field_num;
VALUE fname,val;
VALUE tuple;
if ( tuple_num < 0 || tuple_num >= PQntuples(result) )
rb_raise( rb_eIndexError, "Index %d is out of range", tuple_num );
tuple = rb_hash_new();
for ( field_num = 0; field_num < PQnfields(result); field_num++ ) {
fname = rb_tainted_str_new2( PQfname(result,field_num) );
ASSOCIATE_INDEX(fname, self);
if ( PQgetisnull(result, tuple_num, field_num) ) {
rb_hash_aset( tuple, fname, Qnil );
}
else {
val = rb_tainted_str_new( PQgetvalue(result, tuple_num, field_num ),
PQgetlength(result, tuple_num, field_num) );
/* associate client encoding for text format only */
if ( 0 == PQfformat(result, field_num) ) {
ASSOCIATE_INDEX( val, self );
} else {
#ifdef M17N_SUPPORTED
rb_enc_associate( val, rb_ascii8bit_encoding() );
#endif
}
rb_hash_aset( tuple, fname, val );
}
}
return tuple;
}
|
#clear ⇒ nil
Clears the PGresult object as the result of the query.
3084 3085 3086 3087 3088 3089 3090 |
# File 'ext/pg.c', line 3084
static VALUE
pgresult_clear(VALUE self)
{
PQclear(get_pgresult(self));
DATA_PTR(self) = NULL;
return Qnil;
}
|
#cmd_status ⇒ String
Returns the status string of the last query command.
3423 3424 3425 3426 3427 3428 3429 |
# File 'ext/pg.c', line 3423
static VALUE
pgresult_cmd_status(VALUE self)
{
VALUE ret = rb_tainted_str_new2(PQcmdStatus(get_pgresult(self)));
ASSOCIATE_INDEX(ret, self);
return ret;
}
|
#cmd_tuples ⇒ Fixnum Also known as: cmdtuples
Returns the number of tuples (rows) affected by the SQL command.
If the SQL command that generated the PGresult was not one of:
-
INSERT
-
UPDATE
-
DELETE
-
MOVE
-
FETCH
or if no tuples were affected, 0
is returned.
3445 3446 3447 3448 3449 3450 3451 |
# File 'ext/pg.c', line 3445
static VALUE
pgresult_cmd_tuples(VALUE self)
{
long n;
n = strtol(PQcmdTuples(get_pgresult(self)),NULL, 10);
return INT2NUM(n);
}
|
#column_values(n) ⇒ Array
Returns an Array of the values from the nth column of each tuple in the result.
3573 3574 3575 3576 3577 3578 |
# File 'ext/pg.c', line 3573
static VALUE
pgresult_column_values(VALUE self, VALUE index)
{
int col = NUM2INT( index );
return make_column_result_array( self, col );
}
|
#each {|tuple| ... } ⇒ Object
Invokes block for each tuple in the result set.
3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 |
# File 'ext/pg.c', line 3643
static VALUE
pgresult_each(VALUE self)
{
PGresult *result = get_pgresult(self);
int tuple_num;
for(tuple_num = 0; tuple_num < PQntuples(result); tuple_num++) {
rb_yield(pgresult_aref(self, INT2NUM(tuple_num)));
}
return self;
}
|
#fformat(column_number) ⇒ Fixnum
Returns the format (0 for text, 1 for binary) of column column_number.
Raises ArgumentError if column_number is out of range.
3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 |
# File 'ext/pg.c', line 3219
static VALUE
pgresult_fformat(VALUE self, VALUE column_number)
{
PGresult *result = get_pgresult(self);
int fnumber = NUM2INT(column_number);
if (fnumber < 0 || fnumber >= PQnfields(result)) {
rb_raise(rb_eArgError, "Column number is out of range: %d",
fnumber);
}
return INT2FIX(PQfformat(result, fnumber));
}
|
#field_values(field) ⇒ Array
Returns an Array of the values from the given field of each tuple in the result.
3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 |
# File 'ext/pg.c', line 3588
static VALUE
pgresult_field_values( VALUE self, VALUE field )
{
PGresult *result = get_pgresult( self );
const char *fieldname = RSTRING_PTR( field );
int fnum = PQfnumber( result, fieldname );
if ( fnum < 0 )
rb_raise( rb_eIndexError, "no such field '%s' in result", fieldname );
return make_column_result_array( self, fnum );
}
|
#fields ⇒ Array
Returns an array of Strings representing the names of the fields in the result.
3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 |
# File 'ext/pg.c', line 3661
static VALUE
pgresult_fields(VALUE self)
{
PGresult *result;
VALUE ary;
int n, i;
result = get_pgresult(self);
n = PQnfields(result);
ary = rb_ary_new2(n);
for (i=0;i<n;i++) {
VALUE val = rb_tainted_str_new2(PQfname(result, i));
ASSOCIATE_INDEX(val, self);
rb_ary_push(ary, val);
}
return ary;
}
|
#fmod(column_number) ⇒ Object
Returns the type modifier associated with column column_number. See the #ftype method for an example of how to use this.
Raises an ArgumentError if column_number is out of range.
3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 |
# File 'ext/pg.c', line 3269
static VALUE
pgresult_fmod(VALUE self, VALUE column_number)
{
PGresult *result = get_pgresult(self);
int fnumber = NUM2INT(column_number);
int modifier;
if (fnumber < 0 || fnumber >= PQnfields(result)) {
rb_raise(rb_eArgError, "Column number is out of range: %d",
fnumber);
}
modifier = PQfmod(result,fnumber);
return INT2NUM(modifier);
}
|
#fname(index) ⇒ String
Returns the name of the column corresponding to index.
3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 |
# File 'ext/pg.c', line 3122
static VALUE
pgresult_fname(VALUE self, VALUE index)
{
VALUE fname;
PGresult *result;
int i = NUM2INT(index);
result = get_pgresult(self);
if (i < 0 || i >= PQnfields(result)) {
rb_raise(rb_eArgError,"invalid field number %d", i);
}
fname = rb_tainted_str_new2(PQfname(result, i));
ASSOCIATE_INDEX(fname, self);
return fname;
}
|
#fnumber(name) ⇒ Fixnum
Returns the index of the field specified by the string name.
Raises an ArgumentError if the specified name isn’t one of the field names; raises a TypeError if name is not a String.
3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 |
# File 'ext/pg.c', line 3147
static VALUE
pgresult_fnumber(VALUE self, VALUE name)
{
int n;
Check_Type(name, T_STRING);
n = PQfnumber(get_pgresult(self), StringValuePtr(name));
if (n == -1) {
rb_raise(rb_eArgError,"Unknown field: %s", StringValuePtr(name));
}
return INT2FIX(n);
}
|
#fsize(index) ⇒ Object
Returns the size of the field type in bytes. Returns -1
if the field is variable sized.
res = conn.exec("SELECT myInt, myVarChar50 FROM foo")
res.size(0) => 4
res.size(1) => -1
3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 |
# File 'ext/pg.c', line 3294
static VALUE
pgresult_fsize(VALUE self, VALUE index)
{
PGresult *result;
int i = NUM2INT(index);
result = get_pgresult(self);
if (i < 0 || i >= PQnfields(result)) {
rb_raise(rb_eArgError,"invalid field number %d", i);
}
return INT2NUM(PQfsize(result, i));
}
|
#ftable(column_number) ⇒ Fixnum
Returns the Oid of the table from which the column column_number was fetched.
Raises ArgumentError if column_number is out of range or if the Oid is undefined for that column.
3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 |
# File 'ext/pg.c', line 3171
static VALUE
pgresult_ftable(VALUE self, VALUE column_number)
{
Oid n ;
int col_number = NUM2INT(column_number);
PGresult *pgresult = get_pgresult(self);
if( col_number < 0 || col_number >= PQnfields(pgresult))
rb_raise(rb_eArgError,"Invalid column index: %d", col_number);
n = PQftable(pgresult, col_number);
return INT2FIX(n);
}
|
#ftablecol(column_number) ⇒ Fixnum
Returns the column number (within its table) of the table from which the column column_number is made up.
Raises ArgumentError if column_number is out of range or if the column number from its table is undefined for that column.
3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 |
# File 'ext/pg.c', line 3195
static VALUE
pgresult_ftablecol(VALUE self, VALUE column_number)
{
int col_number = NUM2INT(column_number);
PGresult *pgresult = get_pgresult(self);
int n;
if( col_number < 0 || col_number >= PQnfields(pgresult))
rb_raise(rb_eArgError,"Invalid column index: %d", col_number);
n = PQftablecol(pgresult, col_number);
return INT2FIX(n);
}
|
#ftype(column_number) ⇒ Object
Returns the data type associated with column_number.
The integer returned is the internal OID
number (in PostgreSQL) of the type. To get a human-readable value for the type, use the returned OID and the field’s #fmod value with the format_type() SQL function:
# Get the type of the second column of the result 'res'
typename = conn.
exec( "SELECT format_type($1,$2)", [res.ftype(1), res.fmod(1)] ).
getvalue( 0, 0 )
Raises an ArgumentError if column_number is out of range.
3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 |
# File 'ext/pg.c', line 3249
static VALUE
pgresult_ftype(VALUE self, VALUE index)
{
PGresult* result = get_pgresult(self);
int i = NUM2INT(index);
if (i < 0 || i >= PQnfields(result)) {
rb_raise(rb_eArgError, "invalid field number %d", i);
}
return INT2NUM(PQftype(result, i));
}
|
#getisnull(tuple_position, field_position) ⇒ Boolean
Returns true
if the specified value is nil
; false
otherwise.
3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 |
# File 'ext/pg.c', line 3343
static VALUE
pgresult_getisnull(VALUE self, VALUE tup_num, VALUE field_num)
{
PGresult *result;
int i = NUM2INT(tup_num);
int j = NUM2INT(field_num);
result = get_pgresult(self);
if (i < 0 || i >= PQntuples(result)) {
rb_raise(rb_eArgError,"invalid tuple number %d", i);
}
if (j < 0 || j >= PQnfields(result)) {
rb_raise(rb_eArgError,"invalid field number %d", j);
}
return PQgetisnull(result, i, j) ? Qtrue : Qfalse;
}
|
#getlength(tup_num, field_num) ⇒ Fixnum
Returns the (String) length of the field in bytes.
Equivalent to res.value(tup_num,field_num).length
.
3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 |
# File 'ext/pg.c', line 3368
static VALUE
pgresult_getlength(VALUE self, VALUE tup_num, VALUE field_num)
{
PGresult *result;
int i = NUM2INT(tup_num);
int j = NUM2INT(field_num);
result = get_pgresult(self);
if (i < 0 || i >= PQntuples(result)) {
rb_raise(rb_eArgError,"invalid tuple number %d", i);
}
if (j < 0 || j >= PQnfields(result)) {
rb_raise(rb_eArgError,"invalid field number %d", j);
}
return INT2FIX(PQgetlength(result, i, j));
}
|
#getvalue(tup_num, field_num) ⇒ Object
Returns the value in tuple number tup_num, field field_num, or nil
if the field is NULL
.
3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 |
# File 'ext/pg.c', line 3314
static VALUE
pgresult_getvalue(VALUE self, VALUE tup_num, VALUE field_num)
{
VALUE ret;
PGresult *result;
int i = NUM2INT(tup_num);
int j = NUM2INT(field_num);
result = get_pgresult(self);
if(i < 0 || i >= PQntuples(result)) {
rb_raise(rb_eArgError,"invalid tuple number %d", i);
}
if(j < 0 || j >= PQnfields(result)) {
rb_raise(rb_eArgError,"invalid field number %d", j);
}
if(PQgetisnull(result, i, j))
return Qnil;
ret = rb_tainted_str_new(PQgetvalue(result, i, j),
PQgetlength(result, i, j));
ASSOCIATE_INDEX(ret, self);
return ret;
}
|
#nfields ⇒ Fixnum Also known as: num_fields
Returns the number of columns in the query result.
3110 3111 3112 3113 3114 |
# File 'ext/pg.c', line 3110
static VALUE
pgresult_nfields(VALUE self)
{
return INT2NUM(PQnfields(get_pgresult(self)));
}
|
#nparams ⇒ Fixnum
Returns the number of parameters of a prepared statement. Only useful for the result returned by conn.describePrepared
3392 3393 3394 3395 3396 3397 3398 3399 |
# File 'ext/pg.c', line 3392
static VALUE
pgresult_nparams(VALUE self)
{
PGresult *result;
result = get_pgresult(self);
return INT2FIX(PQnparams(result));
}
|
#ntuples ⇒ Fixnum Also known as: num_tuples
Returns the number of tuples in the query result.
3098 3099 3100 3101 3102 |
# File 'ext/pg.c', line 3098
static VALUE
pgresult_ntuples(VALUE self)
{
return INT2FIX(PQntuples(get_pgresult(self)));
}
|
#oid_value ⇒ Fixnum
Returns the oid
of the inserted row if applicable, otherwise nil
.
3460 3461 3462 3463 3464 3465 3466 3467 3468 |
# File 'ext/pg.c', line 3460
static VALUE
pgresult_oid_value(VALUE self)
{
Oid n = PQoidValue(get_pgresult(self));
if (n == InvalidOid)
return Qnil;
else
return INT2FIX(n);
}
|
#paramtype(param_number) ⇒ Oid
Returns the Oid of the data type of parameter param_number. Only useful for the result returned by conn.describePrepared
3408 3409 3410 3411 3412 3413 3414 3415 |
# File 'ext/pg.c', line 3408
static VALUE
pgresult_paramtype(VALUE self, VALUE param_number)
{
PGresult *result;
result = get_pgresult(self);
return INT2FIX(PQparamtype(result,NUM2INT(param_number)));
}
|
#res_status(status) ⇒ String
Returns the string representation of status status
.
3026 3027 3028 3029 3030 3031 3032 |
# File 'ext/pg.c', line 3026
static VALUE
pgresult_res_status(VALUE self, VALUE status)
{
VALUE ret = rb_tainted_str_new2(PQresStatus(NUM2INT(status)));
ASSOCIATE_INDEX(ret, self);
return ret;
}
|
#result_error_field(fieldcode) ⇒ String
Returns the individual field of an error.
fieldcode
is one of:
-
PG_DIAG_SEVERITY
-
PG_DIAG_SQLSTATE
-
PG_DIAG_MESSAGE_PRIMARY
-
PG_DIAG_MESSAGE_DETAIL
-
PG_DIAG_MESSAGE_HINT
-
PG_DIAG_STATEMENT_POSITION
-
PG_DIAG_INTERNAL_POSITION
-
PG_DIAG_INTERNAL_QUERY
-
PG_DIAG_CONTEXT
-
PG_DIAG_SOURCE_FILE
-
PG_DIAG_SOURCE_LINE
-
PG_DIAG_SOURCE_FUNCTION
3068 3069 3070 3071 3072 3073 3074 3075 3076 |
# File 'ext/pg.c', line 3068
static VALUE
pgresult_result_error_field(VALUE self, VALUE field)
{
PGresult *result = get_pgresult(self);
int fieldcode = NUM2INT(field);
VALUE ret = rb_tainted_str_new2(PQresultErrorField(result,fieldcode));
ASSOCIATE_INDEX(ret, self);
return ret;
}
|
#result_error_message ⇒ String
Returns the error message of the command as a string.
3040 3041 3042 3043 3044 3045 3046 |
# File 'ext/pg.c', line 3040
static VALUE
pgresult_result_error_message(VALUE self)
{
VALUE ret = rb_tainted_str_new2(PQresultErrorMessage(get_pgresult(self)));
ASSOCIATE_INDEX(ret, self);
return ret;
}
|
#result_status ⇒ Fixnum
Returns the status of the query. The status value is one of:
-
PGRES_EMPTY_QUERY
-
PGRES_COMMAND_OK
-
PGRES_TUPLES_OK
-
PGRES_COPY_OUT
-
PGRES_COPY_IN
-
PGRES_BAD_RESPONSE
-
PGRES_NONFATAL_ERROR
-
PGRES_FATAL_ERROR
3013 3014 3015 3016 3017 |
# File 'ext/pg.c', line 3013
static VALUE
pgresult_result_status(VALUE self)
{
return INT2FIX(PQresultStatus(get_pgresult(self)));
}
|
#values ⇒ Array
Returns all tuples as an array of arrays.
3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 |
# File 'ext/pg.c', line 3522
static VALUE
pgresult_values(VALUE self, VALUE index)
{
PGresult* result = (PGresult*) get_pgresult(self);
int row;
int field;
int num_rows = PQntuples(result);
int num_fields = PQnfields(result);
VALUE ary = rb_ary_new2(num_rows);
for ( row = 0; row < num_rows; row++ ) {
/* create new row */
VALUE new_row = rb_ary_new2(num_fields);
/* add to return array */
rb_ary_store( ary, row, new_row );
/* populate it */
for ( field = 0; field < num_fields; field++ ) {
if ( PQgetisnull(result, row, field) ) {
rb_ary_store( new_row, field, Qnil );
}
else {
VALUE val = rb_tainted_str_new( PQgetvalue(result, row, field),
PQgetlength(result, row, field) );
/* associate client encoding for text format only */
if ( 0 == PQfformat(result, field) ) {
ASSOCIATE_INDEX( val, self );
} else {
#ifdef M17N_SUPPORTED
rb_enc_associate( val, rb_ascii8bit_encoding() );
#endif
}
rb_ary_store( new_row, field, val );
}
}
}
return ary;
}
|