本文整理汇总了C++中PQgetlength函数的典型用法代码示例。如果您正苦于以下问题:C++ PQgetlength函数的具体用法?C++ PQgetlength怎么用?C++ PQgetlength使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了PQgetlength函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: FmncMUsergroup
bool PgTblFmncMUsergroup::loadRec(
PGresult* res
, FmncMUsergroup** rec
) {
char* ptr;
FmncMUsergroup* _rec = NULL;
bool retval = false;
if (PQntuples(res) == 1) {
_rec = new FmncMUsergroup();
int fnum[] = {
PQfnumber(res, "ref"),
PQfnumber(res, "grp"),
PQfnumber(res, "own"),
PQfnumber(res, "sref"),
PQfnumber(res, "comment")
};
ptr = PQgetvalue(res, 0, fnum[0]); _rec->ref = atoll(ptr);
ptr = PQgetvalue(res, 0, fnum[1]); _rec->grp = atoll(ptr);
ptr = PQgetvalue(res, 0, fnum[2]); _rec->own = atoll(ptr);
ptr = PQgetvalue(res, 0, fnum[3]); _rec->sref.assign(ptr, PQgetlength(res, 0, fnum[3]));
ptr = PQgetvalue(res, 0, fnum[4]); _rec->Comment.assign(ptr, PQgetlength(res, 0, fnum[4]));
retval = true;
};
PQclear(res);
*rec = _rec;
return retval;
};
示例2: PQgetlength
char * CPgSQL::Fetch(char * buffer, unsigned int buffersize)
{
if (PQstatus(pgsql) != CONNECTION_OK || PQresultStatus(result) != PGRES_TUPLES_OK || PQntuples(result) <= CurRow)
return NULL;
// Calculate length of the row.
unsigned long row_length = 0;
for (unsigned int i = 0; i < NumCol; ++i)
{
// We will need one more character per a column to act as a column separator and a NULL terminating character.
row_length += PQgetlength(result, CurRow, i) + 1;
}
if (row_length == 0)
return NULL;
// If the row length exceeds size of the SPACER buffer, allocate a new one.
// The SPACER will be deleted automatically in nwnx2lib.cpp.
char * result = row_length <= buffersize ? buffer : (char *)malloc(row_length);
for (unsigned int i = 0, pos = 0; i < NumCol; ++i)
{
int length = PQgetlength(this->result, CurRow, i);
strncpy(&result[pos], PQgetvalue(this->result, CurRow, i), length);
pos += length;
result[pos++] = '¬';
}
result[row_length-1] = '\0';
CurRow++;
return result;
}
示例3: PlnrRMStackMStructure
bool PgTblPlnrRMStackMStructure::loadRec(
PGresult* res
, PlnrRMStackMStructure** rec
) {
char* ptr;
PlnrRMStackMStructure* _rec = NULL;
bool retval = false;
if (PQntuples(res) == 1) {
_rec = new PlnrRMStackMStructure();
int fnum[] = {
PQfnumber(res, "ref"),
PQfnumber(res, "refplnrmstack"),
PQfnumber(res, "refplnrmstructure"),
PQfnumber(res, "fromsrefplnrmlayer"),
PQfnumber(res, "tosrefplnrmlayer")
};
ptr = PQgetvalue(res, 0, fnum[0]); _rec->ref = atoll(ptr);
ptr = PQgetvalue(res, 0, fnum[1]); _rec->refPlnrMStack = atoll(ptr);
ptr = PQgetvalue(res, 0, fnum[2]); _rec->refPlnrMStructure = atoll(ptr);
ptr = PQgetvalue(res, 0, fnum[3]); _rec->fromSrefPlnrMLayer.assign(ptr, PQgetlength(res, 0, fnum[3]));
ptr = PQgetvalue(res, 0, fnum[4]); _rec->toSrefPlnrMLayer.assign(ptr, PQgetlength(res, 0, fnum[4]));
retval = true;
};
PQclear(res);
*rec = _rec;
return retval;
};
示例4: FmncAMToolChar
bool PgTblFmncAMToolChar::loadRec(
PGresult* res
, FmncAMToolChar** rec
) {
char* ptr;
FmncAMToolChar* _rec = NULL;
bool retval = false;
if (PQntuples(res) == 1) {
_rec = new FmncAMToolChar();
int fnum[] = {
PQfnumber(res, "ref"),
PQfnumber(res, "reffmncmtool"),
PQfnumber(res, "x1osreffmncktoolchar"),
PQfnumber(res, "val"),
PQfnumber(res, "comment")
};
ptr = PQgetvalue(res, 0, fnum[0]); _rec->ref = atoll(ptr);
ptr = PQgetvalue(res, 0, fnum[1]); _rec->refFmncMTool = atoll(ptr);
ptr = PQgetvalue(res, 0, fnum[2]); _rec->x1OsrefFmncKToolchar.assign(ptr, PQgetlength(res, 0, fnum[2]));
ptr = PQgetvalue(res, 0, fnum[3]); _rec->Val.assign(ptr, PQgetlength(res, 0, fnum[3]));
ptr = PQgetvalue(res, 0, fnum[4]); _rec->Comment.assign(ptr, PQgetlength(res, 0, fnum[4]));
retval = true;
};
PQclear(res);
*rec = _rec;
return retval;
};
示例5: PQntuples
ubigint PgTblFmncQPrsList::loadRst(
PGresult* res
, const bool append
, ListFmncQPrsList& rst
) {
ubigint numrow; ubigint numread = 0; char* ptr;
FmncQPrsList* rec;
if (!append) rst.clear();
numrow = PQntuples(res);
if (numrow > 0) {
rst.nodes.reserve(rst.nodes.size() + numrow);
int fnum[] = {
PQfnumber(res, "qref"),
PQfnumber(res, "jref"),
PQfnumber(res, "jnum"),
PQfnumber(res, "ref"),
PQfnumber(res, "title"),
PQfnumber(res, "firstname"),
PQfnumber(res, "lastname"),
PQfnumber(res, "grp"),
PQfnumber(res, "own"),
PQfnumber(res, "reffmncmorg"),
PQfnumber(res, "reffmncmaddress"),
PQfnumber(res, "ixvsex"),
PQfnumber(res, "tel"),
PQfnumber(res, "eml")
};
while (numread < numrow) {
rec = new FmncQPrsList();
ptr = PQgetvalue(res, numread, fnum[0]); rec->qref = atoll(ptr);
ptr = PQgetvalue(res, numread, fnum[1]); rec->jref = atoll(ptr);
ptr = PQgetvalue(res, numread, fnum[2]); rec->jnum = atol(ptr);
ptr = PQgetvalue(res, numread, fnum[3]); rec->ref = atoll(ptr);
ptr = PQgetvalue(res, numread, fnum[4]); rec->Title.assign(ptr, PQgetlength(res, numread, fnum[4]));
ptr = PQgetvalue(res, numread, fnum[5]); rec->Firstname.assign(ptr, PQgetlength(res, numread, fnum[5]));
ptr = PQgetvalue(res, numread, fnum[6]); rec->Lastname.assign(ptr, PQgetlength(res, numread, fnum[6]));
ptr = PQgetvalue(res, numread, fnum[7]); rec->grp = atoll(ptr);
ptr = PQgetvalue(res, numread, fnum[8]); rec->own = atoll(ptr);
ptr = PQgetvalue(res, numread, fnum[9]); rec->refFmncMOrg = atoll(ptr);
ptr = PQgetvalue(res, numread, fnum[10]); rec->refFmncMAddress = atoll(ptr);
ptr = PQgetvalue(res, numread, fnum[11]); rec->ixVSex = atol(ptr);
ptr = PQgetvalue(res, numread, fnum[12]); rec->Tel.assign(ptr, PQgetlength(res, numread, fnum[12]));
ptr = PQgetvalue(res, numread, fnum[13]); rec->Eml.assign(ptr, PQgetlength(res, numread, fnum[13]));
rst.nodes.push_back(rec);
numread++;
};
};
PQclear(res);
return numread;
};
示例6: PQntuples
ubigint PgTblFmncQStpKSteppar::loadRst(
PGresult* res
, const bool append
, ListFmncQStpKSteppar& rst
) {
ubigint numrow; ubigint numread = 0; char* ptr;
FmncQStpKSteppar* rec;
if (!append) rst.clear();
numrow = PQntuples(res);
if (numrow > 0) {
rst.nodes.reserve(rst.nodes.size() + numrow);
int fnum[] = {
PQfnumber(res, "qref"),
PQfnumber(res, "jref"),
PQfnumber(res, "jnum"),
PQfnumber(res, "ref"),
PQfnumber(res, "klsnum"),
PQfnumber(res, "fixed"),
PQfnumber(res, "sref"),
PQfnumber(res, "avail"),
PQfnumber(res, "implied"),
PQfnumber(res, "refj"),
PQfnumber(res, "title"),
PQfnumber(res, "comment")
};
while (numread < numrow) {
rec = new FmncQStpKSteppar();
ptr = PQgetvalue(res, numread, fnum[0]); rec->qref = atoll(ptr);
ptr = PQgetvalue(res, numread, fnum[1]); rec->jref = atoll(ptr);
ptr = PQgetvalue(res, numread, fnum[2]); rec->jnum = atol(ptr);
ptr = PQgetvalue(res, numread, fnum[3]); rec->ref = atoll(ptr);
ptr = PQgetvalue(res, numread, fnum[4]); rec->klsNum = atol(ptr);
ptr = PQgetvalue(res, numread, fnum[5]); rec->Fixed = (atoi(ptr) != 0);
ptr = PQgetvalue(res, numread, fnum[6]); rec->sref.assign(ptr, PQgetlength(res, numread, fnum[6]));
ptr = PQgetvalue(res, numread, fnum[7]); rec->Avail.assign(ptr, PQgetlength(res, numread, fnum[7]));
ptr = PQgetvalue(res, numread, fnum[8]); rec->Implied.assign(ptr, PQgetlength(res, numread, fnum[8]));
ptr = PQgetvalue(res, numread, fnum[9]); rec->refJ = atoll(ptr);
ptr = PQgetvalue(res, numread, fnum[10]); rec->Title.assign(ptr, PQgetlength(res, numread, fnum[10]));
ptr = PQgetvalue(res, numread, fnum[11]); rec->Comment.assign(ptr, PQgetlength(res, numread, fnum[11]));
rst.nodes.push_back(rec);
numread++;
};
};
PQclear(res);
return numread;
};
示例7: show_binary_results
/*
* This function prints a query result that is a binary-format fetch from
* a table defined as in the comment above. We split it out because the
* main() function uses it twice.
*/
static void
show_binary_results(PGresult *res)
{
int i,
j;
int i_fnum,
t_fnum,
b_fnum;
/* Use PQfnumber to avoid assumptions about field order in result */
i_fnum = PQfnumber(res, "i");
t_fnum = PQfnumber(res, "t");
b_fnum = PQfnumber(res, "b");
for (i = 0; i < PQntuples(res); i++)
{
char *iptr;
char *tptr;
char *bptr;
int blen;
int ival;
/* Get the field values (we ignore possibility they are null!) */
iptr = PQgetvalue(res, i, i_fnum);
tptr = PQgetvalue(res, i, t_fnum);
bptr = PQgetvalue(res, i, b_fnum);
/*
* The binary representation of INT4 is in network byte order, which
* we'd better coerce to the local byte order.
*/
ival = ntohl(*((uint32_t *) iptr));
/*
* The binary representation of TEXT is, well, text, and since libpq
* was nice enough to append a zero byte to it, it'll work just fine
* as a C string.
*
* The binary representation of BYTEA is a bunch of bytes, which could
* include embedded nulls so we have to pay attention to field length.
*/
blen = PQgetlength(res, i, b_fnum);
printf("tuple %d: got\n", i);
printf(" i = (%d bytes) %d\n",
PQgetlength(res, i, i_fnum), ival);
printf(" t = (%d bytes) '%s'\n",
PQgetlength(res, i, t_fnum), tptr);
printf(" b = (%d bytes) ", blen);
for (j = 0; j < blen; j++)
printf("\\%03o", bptr[j]);
printf("\n\n");
}
}
示例8: PQntuples
ubigint PgTblFmncMSample::loadRst(
PGresult* res
, const bool append
, ListFmncMSample& rst
) {
ubigint numrow; ubigint numread = 0; char* ptr;
FmncMSample* rec;
if (!append) rst.clear();
numrow = PQntuples(res);
if (numrow > 0) {
rst.nodes.reserve(rst.nodes.size() + numrow);
int fnum[] = {
PQfnumber(res, "ref"),
PQfnumber(res, "grp"),
PQfnumber(res, "own"),
PQfnumber(res, "supreffmncmsample"),
PQfnumber(res, "suplvl"),
PQfnumber(res, "reffmncmarticle"),
PQfnumber(res, "sref"),
PQfnumber(res, "material"),
PQfnumber(res, "refjstate"),
PQfnumber(res, "ixvstate"),
PQfnumber(res, "comment")
};
while (numread < numrow) {
rec = new FmncMSample();
ptr = PQgetvalue(res, numread, fnum[0]); rec->ref = atoll(ptr);
ptr = PQgetvalue(res, numread, fnum[1]); rec->grp = atoll(ptr);
ptr = PQgetvalue(res, numread, fnum[2]); rec->own = atoll(ptr);
ptr = PQgetvalue(res, numread, fnum[3]); rec->supRefFmncMSample = atoll(ptr);
ptr = PQgetvalue(res, numread, fnum[4]); rec->supLvl = atoi(ptr);
ptr = PQgetvalue(res, numread, fnum[5]); rec->refFmncMArticle = atoll(ptr);
ptr = PQgetvalue(res, numread, fnum[6]); rec->sref.assign(ptr, PQgetlength(res, numread, fnum[6]));
ptr = PQgetvalue(res, numread, fnum[7]); rec->Material.assign(ptr, PQgetlength(res, numread, fnum[7]));
ptr = PQgetvalue(res, numread, fnum[8]); rec->refJState = atoll(ptr);
ptr = PQgetvalue(res, numread, fnum[9]); rec->ixVState = atol(ptr);
ptr = PQgetvalue(res, numread, fnum[10]); rec->Comment.assign(ptr, PQgetlength(res, numread, fnum[10]));
rst.nodes.push_back(rec);
numread++;
};
};
PQclear(res);
return numread;
};
示例9: FmncQPrsList
bool PgTblFmncQPrsList::loadRec(
PGresult* res
, FmncQPrsList** rec
) {
char* ptr;
FmncQPrsList* _rec = NULL;
bool retval = false;
if (PQntuples(res) == 1) {
_rec = new FmncQPrsList();
int fnum[] = {
PQfnumber(res, "qref"),
PQfnumber(res, "jref"),
PQfnumber(res, "jnum"),
PQfnumber(res, "ref"),
PQfnumber(res, "title"),
PQfnumber(res, "firstname"),
PQfnumber(res, "lastname"),
PQfnumber(res, "grp"),
PQfnumber(res, "own"),
PQfnumber(res, "reffmncmorg"),
PQfnumber(res, "reffmncmaddress"),
PQfnumber(res, "ixvsex"),
PQfnumber(res, "tel"),
PQfnumber(res, "eml")
};
ptr = PQgetvalue(res, 0, fnum[0]); _rec->qref = atoll(ptr);
ptr = PQgetvalue(res, 0, fnum[1]); _rec->jref = atoll(ptr);
ptr = PQgetvalue(res, 0, fnum[2]); _rec->jnum = atol(ptr);
ptr = PQgetvalue(res, 0, fnum[3]); _rec->ref = atoll(ptr);
ptr = PQgetvalue(res, 0, fnum[4]); _rec->Title.assign(ptr, PQgetlength(res, 0, fnum[4]));
ptr = PQgetvalue(res, 0, fnum[5]); _rec->Firstname.assign(ptr, PQgetlength(res, 0, fnum[5]));
ptr = PQgetvalue(res, 0, fnum[6]); _rec->Lastname.assign(ptr, PQgetlength(res, 0, fnum[6]));
ptr = PQgetvalue(res, 0, fnum[7]); _rec->grp = atoll(ptr);
ptr = PQgetvalue(res, 0, fnum[8]); _rec->own = atoll(ptr);
ptr = PQgetvalue(res, 0, fnum[9]); _rec->refFmncMOrg = atoll(ptr);
ptr = PQgetvalue(res, 0, fnum[10]); _rec->refFmncMAddress = atoll(ptr);
ptr = PQgetvalue(res, 0, fnum[11]); _rec->ixVSex = atol(ptr);
ptr = PQgetvalue(res, 0, fnum[12]); _rec->Tel.assign(ptr, PQgetlength(res, 0, fnum[12]));
ptr = PQgetvalue(res, 0, fnum[13]); _rec->Eml.assign(ptr, PQgetlength(res, 0, fnum[13]));
retval = true;
};
PQclear(res);
*rec = _rec;
return retval;
};
示例10: PQntuples
ubigint PgTblPlnrQDtpKParKey::loadRst(
PGresult* res
, const bool append
, ListPlnrQDtpKParKey& rst
) {
ubigint numrow; ubigint numread = 0; char* ptr;
PlnrQDtpKParKey* rec;
if (!append) rst.clear();
numrow = PQntuples(res);
if (numrow > 0) {
rst.nodes.reserve(rst.nodes.size() + numrow);
int fnum[] = {
PQfnumber(res, "qref"),
PQfnumber(res, "jref"),
PQfnumber(res, "jnum"),
PQfnumber(res, "ref"),
PQfnumber(res, "klsnum"),
PQfnumber(res, "sref"),
PQfnumber(res, "refj"),
PQfnumber(res, "title"),
PQfnumber(res, "comment")
};
while (numread < numrow) {
rec = new PlnrQDtpKParKey();
ptr = PQgetvalue(res, numread, fnum[0]); rec->qref = atoll(ptr);
ptr = PQgetvalue(res, numread, fnum[1]); rec->jref = atoll(ptr);
ptr = PQgetvalue(res, numread, fnum[2]); rec->jnum = atol(ptr);
ptr = PQgetvalue(res, numread, fnum[3]); rec->ref = atoll(ptr);
ptr = PQgetvalue(res, numread, fnum[4]); rec->klsNum = atol(ptr);
ptr = PQgetvalue(res, numread, fnum[5]); rec->sref.assign(ptr, PQgetlength(res, numread, fnum[5]));
ptr = PQgetvalue(res, numread, fnum[6]); rec->refJ = atoll(ptr);
ptr = PQgetvalue(res, numread, fnum[7]); rec->Title.assign(ptr, PQgetlength(res, numread, fnum[7]));
ptr = PQgetvalue(res, numread, fnum[8]); rec->Comment.assign(ptr, PQgetlength(res, numread, fnum[8]));
rst.nodes.push_back(rec);
numread++;
};
};
PQclear(res);
return numread;
};
示例11: PQfnumber
bool PostgreSQLInterface::PQGetValueFromBinary(unsigned int *output, PGresult *result, int rowIndex, const char *columnName)
{
int columnIndex = PQfnumber(result, columnName); if (columnIndex==-1) return false;
char *binaryData = PQgetvalue(result, rowIndex, columnIndex);
if (binaryData==0 || PQgetlength(result, rowIndex, columnIndex)==0)
return false;
if (binaryData)
{
RakAssert(PQgetlength(result, rowIndex, columnIndex)==sizeof(unsigned int));
memcpy(output, binaryData, sizeof(unsigned int));
EndianSwapInPlace((char*)output, sizeof(unsigned int));
return true;
}
return false;
}
示例12: FmncQStpKSteppar
bool PgTblFmncQStpKSteppar::loadRec(
PGresult* res
, FmncQStpKSteppar** rec
) {
char* ptr;
FmncQStpKSteppar* _rec = NULL;
bool retval = false;
if (PQntuples(res) == 1) {
_rec = new FmncQStpKSteppar();
int fnum[] = {
PQfnumber(res, "qref"),
PQfnumber(res, "jref"),
PQfnumber(res, "jnum"),
PQfnumber(res, "ref"),
PQfnumber(res, "klsnum"),
PQfnumber(res, "fixed"),
PQfnumber(res, "sref"),
PQfnumber(res, "avail"),
PQfnumber(res, "implied"),
PQfnumber(res, "refj"),
PQfnumber(res, "title"),
PQfnumber(res, "comment")
};
ptr = PQgetvalue(res, 0, fnum[0]); _rec->qref = atoll(ptr);
ptr = PQgetvalue(res, 0, fnum[1]); _rec->jref = atoll(ptr);
ptr = PQgetvalue(res, 0, fnum[2]); _rec->jnum = atol(ptr);
ptr = PQgetvalue(res, 0, fnum[3]); _rec->ref = atoll(ptr);
ptr = PQgetvalue(res, 0, fnum[4]); _rec->klsNum = atol(ptr);
ptr = PQgetvalue(res, 0, fnum[5]); _rec->Fixed = (atoi(ptr) != 0);
ptr = PQgetvalue(res, 0, fnum[6]); _rec->sref.assign(ptr, PQgetlength(res, 0, fnum[6]));
ptr = PQgetvalue(res, 0, fnum[7]); _rec->Avail.assign(ptr, PQgetlength(res, 0, fnum[7]));
ptr = PQgetvalue(res, 0, fnum[8]); _rec->Implied.assign(ptr, PQgetlength(res, 0, fnum[8]));
ptr = PQgetvalue(res, 0, fnum[9]); _rec->refJ = atoll(ptr);
ptr = PQgetvalue(res, 0, fnum[10]); _rec->Title.assign(ptr, PQgetlength(res, 0, fnum[10]));
ptr = PQgetvalue(res, 0, fnum[11]); _rec->Comment.assign(ptr, PQgetlength(res, 0, fnum[11]));
retval = true;
};
PQclear(res);
*rec = _rec;
return retval;
};
示例13: make_column_result_array
/*
* Make a Ruby array out of the encoded values from the specified
* column in the given result.
*/
static VALUE
make_column_result_array( VALUE self, int col )
{
PGresult *result = pgresult_get( self );
int rows = PQntuples( result );
int i;
VALUE val = Qnil;
VALUE results = rb_ary_new2( rows );
if ( col >= PQnfields(result) )
rb_raise( rb_eIndexError, "no column %d in result", col );
for ( i=0; i < rows; i++ ) {
val = rb_tainted_str_new( PQgetvalue(result, i, col),
PQgetlength(result, i, col) );
#ifdef M17N_SUPPORTED
/* associate client encoding for text format only */
if ( 0 == PQfformat(result, col) ) {
ASSOCIATE_INDEX( val, self );
} else {
rb_enc_associate( val, rb_ascii8bit_encoding() );
}
#endif
rb_ary_store( results, i, val );
}
return results;
}
示例14: pgsql_get_user_key
static int pgsql_get_user_key(u08bits *usname, u08bits *realm, hmackey_t key) {
int ret = -1;
PGconn * pqc = get_pqdb_connection();
if(pqc) {
char statement[TURN_LONG_STRING_SIZE];
/* direct user input eliminated - there is no SQL injection problem (since version 4.4.5.3) */
snprintf(statement,sizeof(statement),"select hmackey from turnusers_lt where name='%s' and realm='%s'",usname,realm);
PGresult *res = PQexec(pqc, statement);
if(!res || (PQresultStatus(res) != PGRES_TUPLES_OK) || (PQntuples(res)!=1)) {
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "Error retrieving PostgreSQL DB information: %s\n",PQerrorMessage(pqc));
} else {
char *kval = PQgetvalue(res,0,0);
int len = PQgetlength(res,0,0);
if(kval) {
size_t sz = get_hmackey_size(SHATYPE_DEFAULT);
if(((size_t)len<sz*2)||(strlen(kval)<sz*2)) {
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "Wrong key format: %s, user %s\n",kval,usname);
} else if(convert_string_key_to_binary(kval, key, sz)<0) {
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "Wrong key: %s, user %s\n",kval,usname);
} else {
ret = 0;
}
} else {
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "Wrong hmackey data for user %s: NULL\n",usname);
}
}
if(res)
PQclear(res);
}
return ret;
}
示例15: result_each
static VALUE result_each(VALUE self) {
int r, c, rows, cols, *types, failed;
PGresult *res;
Data_Get_Struct(self, PGresult, res);
VALUE fields = rb_ary_new();
rows = PQntuples(res);
cols = PQnfields(res);
types = (int*)malloc(sizeof(int)*cols);
for (c = 0; c < cols; c++) {
rb_ary_push(fields, ID2SYM(rb_intern(PQfname(res, c))));
types[c] = PQftype(res, c);
}
for (r = 0; r < rows; r++) {
VALUE tuple = rb_hash_new();
for (c = 0; c < cols; c++) {
rb_hash_aset(tuple, rb_ary_entry(fields, c),
PQgetisnull(res, r, c) ? Qnil : typecast(PQgetvalue(res, r, c), PQgetlength(res, r, c), types[c]));
}
rb_protect(rb_yield, tuple, &failed);
if (failed) {
free(types);
rb_jump_tag(failed);
}
}
free(types);
return Qnil;
}