+ noconversion:
+ ZVAL_STR(zv, str);
+ return zv;
+}
+
+static inline zval *php_pqres_get_col(php_pqres_t *r, unsigned row, unsigned col, zval *zv)
+{
+ if (PQgetisnull(r->res, row, col)) {
+ ZVAL_NULL(zv);
+ } else {
+ ZVAL_STRINGL(zv, PQgetvalue(r->res, row, col), PQgetlength(r->res, row, col));
+ zv = php_pqres_typed_zval(r, PQftype(r->res, col), zv);
+ }
+
+ return zv;
+}
+
+static inline void php_pqres_add_col_to_zval(php_pqres_t *r, unsigned row, unsigned col, php_pqres_fetch_t fetch_type, zval *data)
+{
+ if (PQgetisnull(r->res, row, col)) {
+ switch (fetch_type) {
+ case PHP_PQRES_FETCH_OBJECT:
+ add_property_null(data, PQfname(r->res, col));
+ break;
+
+ case PHP_PQRES_FETCH_ASSOC:
+ add_assoc_null(data, PQfname(r->res, col));
+ break;
+
+ case PHP_PQRES_FETCH_ARRAY:
+ add_index_null(data, col);
+ break;
+ }
+ } else {
+ zval zv;
+
+ ZVAL_STRINGL(&zv, PQgetvalue(r->res, row, col), PQgetlength(r->res, row, col));
+ php_pqres_typed_zval(r, PQftype(r->res, col), &zv);
+
+ switch (fetch_type) {
+ case PHP_PQRES_FETCH_OBJECT:
+ add_property_zval(data, PQfname(r->res, col), &zv);
+ zval_ptr_dtor(&zv);
+ break;
+
+ case PHP_PQRES_FETCH_ASSOC:
+ add_assoc_zval(data, PQfname(r->res, col), &zv);
+ break;
+
+ case PHP_PQRES_FETCH_ARRAY:
+ add_index_zval(data, col, &zv);
+ break;
+ }
+ }
+}
+
+zval *php_pqres_row_to_zval(PGresult *res, unsigned row, php_pqres_fetch_t fetch_type, zval *data)
+{
+ int c, cols;
+ php_pqres_object_t *res_obj = PQresultInstanceData(res, php_pqconn_event);
+
+ if (Z_TYPE_P(data) != IS_OBJECT && Z_TYPE_P(data) != IS_ARRAY) {
+ if (PHP_PQRES_FETCH_OBJECT == fetch_type) {
+ object_init(data);
+ } else {
+ array_init(data);
+ }
+ }
+
+ if (PQntuples(res) > row) {
+ for (c = 0, cols = PQnfields(res); c < cols; ++c) {
+ php_pqres_add_col_to_zval(res_obj->intern, row, c, fetch_type, data);